希尔排序:取一个小于n的整数gap(gap又叫做步长),通过把所有距离为gap或者gap的倍数的数据放在一个组里,对每一个组进行插入排序,当每个组有序时,这整个序列就接近有序,然后减小gap,继续上面的操作,gap越小时,预排序完毕越接近有序,当gap等于1时,预排序就相当于直接插入排序。
希尔排序分为两部分:预排序,直接插入排序
关于gap的选择:当数组中元素的个数特别多的时候,还取gap=3就有点说不过去,gap的取值应该与数组元素的个数有关系,gap一般这样取值gap=gap/3+1。
算法如下
void ShellSort(DataType* a, size_t n)//希尔排序
{
assert(a);
int gap = n;
while (gap > 1)
{
gap = gap / 3 + 1;
for (size_t i = 0; i < n - gap; i++)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0 && a[end]>tmp)
{
a[end + gap] = a[end];
end -= gap;
}
a[end + gap] = tmp;
}
}
}
void TestShellSort()
{
DataType a[] = { 2, 5, 6, 9, 8, 3, 1, 0, 7, 4 };
ShellSort(a, sizeof(a) / sizeof(DataType));
PrintfBuff(a, sizeof(a) / sizeof(DataType));
}
int main()
{
TestShellSort();
return 0;
}
运行结果:
关于printfbuff函数见文章