希尔排序又称缩小增量排序。它是插入排序的一种改进版。
它的基本思想是:先将整个待排序列分割成若干子序列分别进行直接插入排序,待整个序列基本有序时再进行一次直接插入排序。
例如对于数列A={49, 38, 65, 97, 76, 13, 27, 49, 55, 04},首先将数列分成五个子序列{A0, A5}, {A1, A6}, {A2,A7}, {A3,A8}, {A4,A9},分别对它们进行直接插入排序。于是第1趟希尔排序之后数列为:{ 13 27 49 55 4 49 38 65 97 76 }。然后再将该数列分成两个子数列{A0,A2,A4,A6,A8}, {A1,A3,A5,A7,A9},于是第3趟希尔排序之后数列为:{ 4 27 13 49 38 55 49 65 97 76 }。最后再进行一次插入排序即可。
用C语言实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <stdio.h>
void print_list(int *ar, int n) { int i; printf("[ "); for (i=0; i<n; i++) { printf("%d ", ar[i]); } printf("]\n");
}
void shell_sort(int *ar, int n) { int d, i, j, tmp; d = n / 2; while (d >= 1) { for (i=d; i<n; i++) { tmp = ar[i]; j = i - d; while (j >= 0 && tmp < ar[j]) { ar[j+d] = ar[j]; j -= d; } ar[j+d] = tmp; } d = d / 2; print_list(ar, n); } }
int main(int argc, char *argv[]) { int a[] = {49, 38, 65, 97, 76, 13, 27, 49, 55, 04}; int len=sizeof(a)/sizeof(int); printf("begin: "); print_list(a, len); shell_sort(a, len); printf("end "); print_list(a, len); return 0; }
|
希尔排序演示图片: