用希尔排序法对一组数据由小到大进行排序,数据分别为 69、56、12、136、3、55、46、 99、88、25。


实现过程:
(1)自定义函数 shsort(),实现希尔排序。

(2) main() 函数作为程序的入口函数。程序代码如下:

#include <stdio.h>

int shsort(int s[], int n) {
    int i, j, d;
    d = n / 2;    //确定固定增虽值
    while (d >= 1) {
        for (i = d + 1; i <= n; ++i) {    //数组下标从d+1开始进行直接插入排序
            s[0] = s[i];  //设置监视哨
            j = i - d;  //确定要进行比较的元素的最右边位置
            while ((j > 0) && (s[0] < s[j])) {
                s[j + d] = s[j];    //数据右移
                j = j - d;  //向左移d个位置
            }
            s[j + d] = s[0];    //在确定的位罝插入s[i]
        }
        d = d / 2;    //增里变为原来的一半
    }
    return 0;
}

int main(void) {
    int a[11], i;    //定义数组及变量为基本整型
    printf("请输入 10 个数据:\n");
    for (i = 1; i <= 10; ++i) {
        scanf("%d", &a[i]);  //从键盘中输入10个数据
    }
    shsort(a, 10);    //调用 shsort()函数
    printf("排序后的顺序是:\n");
    for (i = 1; i <= 10; i++)
        printf("%5d", a[i]);    //输出排序后的数组
    return 0;
}

输出结果:

请输入 10 个数据:
69 56 12 136 3 55 46 99 88 25
排序后的顺序是:
    3   12   25   46   55   56   69   88   99  136

方法二

#include <stdio.h>
void ShellSort(int a[], int n) {
    int i, j, temp;
    int flag, gap = n;
    while (gap > 1) {
        gap = gap / 2;              //每次减半
        flag = 1;
        while (flag) {
            flag = 0;
            for (i = 0; i < n - gap; i++) {
                j = i + gap;
                if (a[i] > a[j]) {
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                    flag = 1;
                }
            }
        }
    }
}

int main(void) {
    int a[10], i;
    printf("请输入 10 个数据:\n");
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    printf("排序前的顺序是:\n");
    for (i = 0; i < 10; i++)
        printf("%-4d", a[i]);
    ShellSort(a, 10);
    printf("\n排序后的顺序是:\n");
    for (i = 0; i < 10; i++)
        printf("%-4d", a[i]);
    printf("\n");
    return 0;

输出结果:

请输入 10 个数据:
69 56 12 136 3 55 46 99 88 25
排序前的顺序是:
69  56  12  136 3   55  46  99  88  25
排序后的顺序是:
3   12  25  46  55  56  69  88  99  136

技术要点:

希尔排序是在直接插入排序的基础上做的改进,也就是将寒排序的序列按固定增量分成若干组,等距者在同二组中,然后再在组内进行直接插入排序。这里面的固定增量从 n/2 开始,以后每次缩小到原来的一半。
不懂希尔排序原理可以看