希尔排序
写写我今天新学的希尔排序。
设数组的大小为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)。

浙公网安备 33010602011771号