#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXlen 100 /* 算法思想简单描述:先将要排序的一组数按某个增量 d分成若干组,每组中记录的下 标相差 d。对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组 中再进行排序。当增量减到 1时,整个要排序的数被分成一组,排序完成。下面的函 数是一个希尔排序算法的一个实现,初次取序列的一半为增量,以后每次减半,直到 增量为 1,希尔排序是不稳定的。 */ void shell_sort(int *x, int n) { // 希尔排序 int h, j, k, t; for (h = n / 2; h > 0; h = h / 2) { /*控制增量*/ for (j = h; j < n; j++) { t = *(x + j); for (k = j - h; (k >= 0 && t < *(x + k)); k -= h) { *(x + k + h) = *(x + k); } *(x + k + h) = t; } } } int main() { int i; int iArr[MAXlen]; srand((unsigned int)time(NULL)); printf(" 排序前: "); for(i = 0 ; i < MAXlen ; i++) { iArr[i] = (unsigned int)rand() % 1000; if(i % 10 == 0) printf("% "); printf("%5d",iArr[i]); } printf(" "); shell_sort(iArr,MAXlen); printf(" 排序后: "); for(i = 0 ; i < MAXlen ; i++) { if(i % 10 == 0) printf("% "); printf("%5d",iArr[i]); } printf(" "); return 0; }