希尔排序
基本思想
1、构造一个步长序列delta1、delta2、…、deltak,其中delta1=n/2,后面的每个delta是前一个的1/2,deltak=1
2、根据步长序列、进行k趟排序
3、对第i趟排序,根据对应的步长delta,将等步长位置元素分组,对同一组内元素在原位置上进行直接插入排序
代码
#include <stdio.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;
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);
for (int i = 0; i < n; i++)
{
printf("%d ", data[i]);
}
return 0;
}
运行结果: