代码改变世界

插入排序

2013-09-16 20:42  北漂男孩  阅读(242)  评论(0编辑  收藏  举报

 最近在复习排序算法,发现排序算法真的博大精深!我乐此不疲的在追求算法,发现算法就在我身边!以下是大熊对排序算法的理解,无私的与大家分享了!

       先不讲理论,举个非常实际的例子!

       不知道看这篇文章的哥子会不会打牌?……不会打的话,那你还是不要学算法了,牌里面那么高深的博弈论就这样被你忽视了!开玩笑。……我们每起一张牌的时候,都会把这张牌插入适合他的位置,比如你手上有3,5,6 三张牌,现在起了一张4,很明显你会把他插到3和5之间。这个动作就是插入排序!恭喜你你已经学会了插入排序

我们来做个实际的例子,先看一组散乱的数字,就像洗散了的牌:

46 59 22 86 70 48 11 9 12 88

我们假设,这10个数字是你之后将起到的10张牌,现在我们来模拟起牌。

第一次你起到46,不做任何事;手上的牌 46

第二次你起到59,跟46比较,比46大,直接放到46右边; 手上的牌  46 59

第三次你起到22,跟59比较,比59小,继续跟46比较,比46小,放到46左边; 手上的牌  22 46 59

第四次你起到86,跟59比较,比59大,直接放到59右边; 手上的牌  22 46 59 86

……

最后我们能把这10 个数从小到大排好,现在再回头看他的规律!

我们会发现,每次我们手上的牌总是有序的,恭喜你已经知道了插入排序的定义!

 

 

掌握方法之后就要用计算机来实现了,这个过程叫做建模,或者抽象。我们先看一组计算机排序结果:

红色数据指交换过位置的数。

待排序的数据:  46 59 22 86 70 48 11 9 12 88

第1趟排序结果:46 59 22 86 70 48 11 9 12 88  //59>46,顺序不变

第2趟排序结果:22 46 59 86 70 48 11 9 12 88 //22<59,两个数交换,22<46,两个数再次交换,记住是每次出现<,都要交换。

第3趟排序结果:22 46 59 86 70 48 11 9 12 88

第4趟排序结果:22 46 59 70 86 48 11 9 12 88

第5趟排序结果:22 46 48 59 70 86 11 9 12 88

第6趟排序结果:11 22 46 48 59 70 86 9 12 88  //11<86,交换……11<22,交换

第7趟排序结果:9 11 22 46 48 59 70 86 12 88

第8趟排序结果:9 11 12 22 46 48 59 70 86 88

第9趟排序结果:9 11 12 22 46 48 59 70 86 88

最终排序结果:9 11 12 22 46 48 59 70 86 88

 

理解原理后,我们来写算法!用C++实现。

 

/*****楚河***************************************我是分界线帅哥*********下面文字来自大熊*********************/

 

#include<iostream>

using namespace std;

//插入排序

void insertSort(int a[999],int n)

{

     int j = 1,i = 1;

     int key = 0,temp = 0;

     for(i = 1;i<n;i++)

     {

          key = a[i];

          for(j = i-1;j>=0;j–)

          {

               if(key<a[j])

               {

                    temp = a[j+1];

                    a[j+1] = a[j];

                    a[j] = temp;

               }

               else

               {

                    a[j+1] = key;//当起到的牌Key大于他前面的那张牌,说明位置放好了,直接跳出

                    break;

               }

          }

     }

}

int main()

{ 

     //test data:46 59 22 86 70 48 11 9 12 88

     int n = 0,i = 0;

     int a[999];

     cin>>n;//输入要排序数的长度

     for(i = 0;i<n;i++)

     {

          cin>>a[i];

     }

     insertSort(a,n);

     cout<<"最终排序结果:";

     for(i = 0;i<n;i++)

     {

          cout<<a[i]<<" ";

     }

     cout<<endl;

     return 0;

}