// 试题四(共15分)
// 阅读下列说明和C代码,回答问题1至问题3,将解答填入答题纸的对应栏内。
// 【说明】
// 希尔排序算法又称最小增量排序算法,其基本思想是:
// 步骤1:构造一个步长序列delta1, delta2, ...., deltak, 其中delta1 = n / 2,后面的每个delta是前一个的1 / 2,deltak = 1;
// 步骤2:根据步长序列进行k趟排序;
// 步骤3:对第i趟排序,根据对应的步长delta,将等步长位置元素分,对同一组内元素在原位置上进行直接插入排序。

// 【C代码】
// 下面的算法用C语言实现
// (1)常量和变量说明
// Data:待排序数组data,长度为n,待排序数据在data[0], data[1], data[2]..., data[n - 1]中。
// N:数组data中的元素个数
// delta:步长数组

// (2)C程序
#include <stdio.h>
#include <stdlib.h>

void ShellSort(int data[], int n) 
{
    int* delta, k, i, t, dk, j;
    k = n;
    delta = (int*) malloc(sizeof(int) * (n / 2));
    i = 0;
    do {
        k = k / 2; // k /= 2
        delta[i ++ ] = k;
    } while (k > 1);
    
    i = 0;
    while ((dk = delta[i]) > 0) {
        for (k = delta[i]; k < n; ++ k )
            if (data[k - dk] > data[k]) {
                t = data[k];
                for (j = k - dk; j >= 0 && t < data[j]; j -= dk)
                    data[j + dk] = data[j];
                data[j + dk] = t;
            }
        ++ i;
    }
}

int main () {
    int n = 7;
    int data[] = {15, 9, 7, 8, 20, -1, 4};
    
    ShellSort(data, n);
    
    int i;
    for (i = 0; i < n; i ++ ) printf("%d ", data[i]);
    
    return 0;
}