在直接插入排序中,最坏的时间复杂度是当待排序的数组是逆序的时候,那时是 o(n^2); 最好的时候是待排序的集合越接近有序时越快,在这个思想下,于是就衍生出了希尔排序。
希尔排序的思想是:把待排序的数据元素分成若干个小组,对同一个小组内的数据元素用直接插入排序;小组的个数逐次缩小,当完成了所有数据元素都在一个组内的排序后排序过程结束。
#include <stdio.h>
#define KeyType int
typedef struct {
KeyType key;
}DataType;
void ShellSort(DataType a[], int n, int d[], int numOfD)
{
int i, j, k, m, span;
DataType temp;
for(m = 0; m < numOfD; m++)
{
span = d[m];
for(k = 0; k < span; k++)
{
for(i = k; i < n-span; i += span)
{
temp = a[i+span];
j = i;
while(j > -1 && temp.key <= a[j].key)
{
a[j+span] = a[j];
j -= span;
}
a[j+span] = temp;
}
}
}
}
int main()
{
DataType a[12] = {65, 34, 25, 87, 12, 38, 56, 46, 14, 77, 92, 23};
int i, n = 6;
int d[3] = {6, 3, 1};
ShellSort(a, 12, d, 3);
for(i = 0; i < 12; i++)
{
printf("%d ", a[i].key);
}
printf("\n");
return 0;
}