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: 运行结果

   

 

posted @ 2013-04-25 21:47  littleCat  阅读(110)  评论(0)    收藏  举报