数据结构排序-希尔排序
希尔排序也是插入排序的一种,但是它效率高于直接插入排序。
基本思想是:
首先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;
然后,取第二个增量d2<的重复上述的分组和排序,直到所取的增量dt=1。
增量序列尤其关键,一般的初次取序列的一半为增量,以后每次减半,直到增量为1.
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int n; 5 6 /* 7 * 希尔排序 8 */ 9 void ShellSort(int *array) 10 { 11 int k = n / 2; //增量序列(仅作举例) 12 while (k > 0) 13 { 14 int i, j; 15 for (i = k + 1; i <=n; i++) 16 { 17 if (array[i] < array[i - k]) 18 { 19 array[0] = array[i]; 20 for (j = i - k; j > 0 && array[0] < array[j]; j -= k) 21 { 22 array[j + k] = array[j]; 23 } 24 array[j + k] = array[0]; 25 } 26 } 27 k = k / 2; 28 } 29 } 30 31 int main() 32 { 33 int i; 34 int *array; 35 printf("请输入数组的大小:"); 36 scanf("%d", &n); 37 array = (int*) malloc(sizeof(int) * (n + 1)); 38 printf("请输入数据(用空格分隔):"); 39 for (i = 1; i <= n; i++) 40 { 41 scanf("%d", &array[i]); 42 } 43 ShellSort(array); 44 printf("排序后为:"); 45 for (i = 1; i <= n; i++) 46 { 47 printf("%d ", array[i]); 48 } 49 printf("\n"); 50 }
直接插入排序是稳定的,最坏时间复杂度为O(n^2),空间复杂度为O(1).
希尔排序是不稳定的,时间复杂度跟增量序列有关,取的增量序列要保证其中的值没有除1之外的公因子,并且最后一个增量必为1.