003希尔排序
希尔排序 - Shell Sort
1:算法介绍
希尔排序是插入排序的一种算法,又称缩小增量排序,该方法将整个无序序列分割成若干小的子序列分别进行插入排序。该方法因DL.Shell于1959年提出而得名。
2:基本思想
首先取一个小于n的整数d1作为第一个增量,所有距离为d1的倍数的记录放在同一个组中,这样就把文件的全部记录分成d1个组。然后各个组内进行直接插入排序;然后去第二个增量d2<d1重复上述的分组和排序,直至最后所取的增量为dt=1,及此时所有的记录放在同一个组中,此时任然进行最终的直接插入排序来获得最终的排序结果。
该方法实际上是一种分组插入算法。一般的初次取序列的一般作为增量,然后每次减半,直到增量为1.
3:算法特点
希尔排序的时间复杂度为O( N*(logN)^2 ),并没有快速排序算法快O( NlogN )。希尔排序算法非常容易实现,代码简单。因此对于中等大小规模表现良好,但是对于规模非常大的数据排序不是最有选择。
此外希尔排序在最坏情况下和平均状况下执行效率相差不是很多。而且由于分组排序导致了希尔排序是不稳定的排序。
4:源代码
View Code
1 #include <stdio.h> 2 3 #define Length 10 4 void shellSort(int A[], int len); 5 void printArray(int A[], int len); 6 7 int main() 8 { 9 int A[Length] = {9,8,7,6,5,4,3,2,1,0}; 10 11 printf("The data before Shell Sort is:\n"); 12 printArray(A, Length); 13 14 shellSort(A, Length); 15 16 printf("\nThe data after Shell Sort is:\n"); 17 printArray(A, Length); 18 return 0; 19 20 } 21 22 //希尔排序 23 void shellSort(int A[], int len) 24 { 25 int i = 0; 26 int j = 0; 27 int temp = 0; 28 int step = len/2; //步长增量 29 30 while(step > 0) 31 { 32 //将所有距离为step的记录分为一组 33 for(i=step+1; i < len; i++) 34 { 35 temp = A[i]; 36 //针对该组内的数据进行插入排序 37 for(j = i - step; j >=0; j=j-step) 38 { 39 if( A[j] > temp ) A[j+step] = A[j]; 40 else break; 41 } 42 A[j+step] = temp; 43 } 44 45 step = step>>1; 46 } 47 } 48 49 void printArray(int A[], int len) 50 { 51 int i; 52 53 for(i = 0; i < len - 1; i++) 54 { 55 if(i < len -1) printf("%d ", A[i]); 56 } 57 58 printf("%d\n", A[i]); 59 }
5: 运行结果

浙公网安备 33010602011771号