算法学习记录-排序——插入排序(Insertion Sort)

插入排序:

在《算法导论》中是这样描述的

这是一个对少量元素进行排序的有效算法。插入排序的工作机理与打牌时候,整理手中的牌做法差不多。

在开始摸牌时,我们的左手是空的,牌面朝下放在桌子上。接着,一次从桌子上摸起一张牌,并将它插入到左手一把牌中的正确位子上。

为了找到这个正确的位置,要将它与手中已有的每一张牌从右到左进行比较,无论什么时候,左手的牌都是排好序的。

 

算法思想:

将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数加1的有序表。

 

图解:

每一张图都是一个for循环。红色和绿色的表示 左手的牌(排好序的数组)。

 

以此类推。。。

 

代码:

 1 void insertionSort(myDataType *ary,int len)
 2 {
 3     int i,j;
 4     myDataType key;
 5     for (i=1;i<len;i++) //第一步没有比较,直接从第二个数(下标为【1】的数开始)
 6     {
 7         key = ary[i]; //待插入的数
 8         
 9         //和已经排好序的数组依次比较
10         j=i-1;
11         while( j >= 0 ) //控制比较的数组是排好序的。排好序的最后一个元素下标为 【i-1】,我们从后往前比较,这样移位比较方便
12         {
13             if (key < ary[j] )
14             {
15                 myDataType temp = ary[j];
16                 ary[j] = key;
17                 ary[j+1] = temp;
18             }
19             j--;
20         }
21     }
22 }

 

完整代码:

 1 #include "stdafx.h"
 2 
 3 
 4 typedef int myDataType;
 5 myDataType src_ary[10] = {9,1,5,8,3,7,6,0,2,4};
 6 
 7 void prt_ary(myDataType *ary,int len)
 8 {
 9     int i=0;
10     while(i < len)
11     {
12         printf(" %d ",ary[i++]);
13     }
14     printf("\n");
15 }
16 void insertionSort(myDataType *ary,int len)
17 {
18     int i,j;
19     myDataType key;
20     for (i=1;i<len;i++) //第一步没有比较,直接从第二个数(下标为【1】的数开始)
21     {
22         key = ary[i]; //待插入的数
23         
24         //和已经排好序的数组依次比较
25         j=i-1;
26         while( j >= 0 ) //控制比较的数组是排好序的。排好序的最后一个元素下标为 【i-1】,我们从后往前比较,这样移位比较方便
27         {
28             if (key < ary[j] )
29             {
30                 myDataType temp = ary[j];
31                 ary[j] = key;
32                 ary[j+1] = temp;
33             }
34             j--;
35         }
36     }
37 }
38 
39 int _tmain(int argc, _TCHAR* argv[])
40 {
41     printf("before sort:\n");
42     prt_ary(src_ary,10);
43 
44     //bubble_sort(src_ary,10);
45     //bubble_sort_modify1(src_ary,10);
46     //bubble_sort_opt(src_ary,10);
47     //selectionSort(src_ary,10);
48     insertionSort(src_ary,10);
49 
50     printf("after sort:\n");
51     prt_ary(src_ary,10);
52 
53 
54 
55     getchar();
56     return 0;
57 }

 

 

posted @ 2013-12-04 17:20  sjdang  阅读(470)  评论(0编辑  收藏  举报