插入排序
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。插入排序主要包括:直接插入排序和希尔排序。
一、直接插入排序
1、排序思想
假设待排序的记录存放在数组R[1..n]中,初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。
2、实例分析
【例】给定一组关键字(46,39,17,23,28,55,18,46),要求按直接插入排序算法给出每一趟排序结果。
3.代码实例
1 #include <stdio.h> 2 //插入排序 3 int* insertSort(int *R,int n) 4 { 5 int i,j; 6 for(i=2;i<n;i++) 7 { 8 if(R[i]<R[i-1]) 9 { 10 R[0]=R[i]; 11 for(j=i-1;R[0]<R[j];j--) 12 { 13 R[j+1]=R[j]; 14 } 15 R[j+1]=R[0]; 16 } 17 } 18 return &R[0]; 19 } 20 21 22 int main() 23 { 24 int a[11] ={NULL,46,39,17,23,28,55,18,46}; 25 int *r = insertSort(&a[0],9); 26 for(int i=1;i<=8;i++) 27 { 28 printf("%d ",r[i]); 29 } 30 return 0 ; 31 }
结果:
二、希尔排序
1、排序思想
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。
2、实例分析
初始关键字序列为(36,25,48,27,65,25,43,58,76,32)。其增量序列的取值依次为5,3,l,排序过程如图所示。
3、代码实例
//希尔排序 int* shellSort(int *R,int dk,int n) { int i,j; for(i=dk+1;i<=n;i++) { if(R[i]<R[i-dk]) { R[0] = R[i]; j=i-dk; while (j>0&&R[0]<R[j]) { R[j+dk]=R[j]; j=j-dk; } R[j+dk]=R[0]; } } return R; } int main() { // 测试希尔排序 int dk[3]={5,3,1}; int a[11] ={NULL,36,25,48,27,65,25,43,58,76,32}; int *p=NULL; for(int i=0;i<3;i++) { p=shellSort(a,dk[i],10); for(int j=1;j<=10;j++) { printf("%d ",p[j]); } printf("\n"); } }