希尔排序

  写写我今天新学的希尔排序。

  设数组的大小为N,首先将数组分为tem = N / 2(这里2这个数,不一定是2,要求但我们假定它就是2,被称为希尔常数,希尔常数的求解一直是数学界的难题,我也是通过其他博客了解到的)。即第一次循环一等分为两个数,这两个数的位置为:第一个设为i(i <= tem),第二个数为i + tem。对这两个数进行判断,用插入排序法进行判断。判断后tem = tem / 2;即组数减少一半儿一组的元素个数变为原来的两倍,第一个元素还是设为i,以此类推直tem == 1。代码如下:

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int N;
 5     scanf("%d",&N);
 6     int a[N];
 7     for(int i = 0; i < N; i++)
 8         scanf("%d",&a[i]);
 9     int tem = N;
10     int i, j, k;
11     do
12     {
13         // 确定分组的增量
14         tem = tem / 2;
15         for (i = 0; i < tem; i++)
16         {
17             for (j = i + tem; j < N; j += tem)
18             {
19                 if (a[j] < a[j - tem])
20                 {
21                     int t= a[j];
22                     for (k = j - tem; k >= 0 && t < a[k]; k -= tem)
23                     {
24                         a[k + tem] = a[k];
25                     }
26                     a[k + tem] = t;
27                 }
28             }
29         }
30     } while (tem > 1);
31     for(int i = 0; i < N; i++)
32         printf("%-d\t",a[i]);
33     return 0;
34 }

  希尔排序的时间复杂度小于O(n2)。

posted @ 2020-03-11 21:52  LYHAC  阅读(97)  评论(0)    收藏  举报