算法学习记录-排序——插入排序(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 }