希尔排序,也称递减增量排序算法
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。
所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序。
取第二个增量d2<d1重复上述的分组和排序,
直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n2),而Hibbard增量的希尔排序的时间复杂度为O(N(5/4))
void mySort(int *a, int len)
{
int gap = 1;
while(gap < len)
{
gap = gap*3+1;
}
while (gap > 0)
{
int i;
for (i = gap; i < len; i++)
{
int get = a[i];
int j = i-gap;
while (j >= 0 && a[j]>get)
{
a[j+gap] = a[j];
j -= gap;
}
a[j+gap] = get;
}
printf ("gap = %d : ", gap);
myPrint(a, len);
gap = gap / 3;
}
}