目录
一、基本思想
希尔排序又称缩小增量法。基本思想为:先选取一个整数gap,将间距为gap的分为一组,并分别对每组的数据进行单独排序。然后通过缩小gap的值进行重复排序,(此前排序称为——预排序),直到gap为1,则排序结束。实际上gap为1时为直接插入排序。
二、代码实现
void ShellSort(int* a, int n)
{
int gap = n;
while (gap > 0)//不能=,会陷入死循环
{
gap = gap / 2;//保证最后一次为InsertSort
//此时的for循环只有一层,同时进行多组排序,不是一组结束再进行下一组
for (int i = 0; i < n - gap; i++)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
三、特性总结
1、希尔排序是对直接插入排序的优化;
2、当gap>1时为预排序 ,目的是让数组更接近有序,让较大的数快速到后面。当gap==1时,此时数组已经接近有序,最后一次为直接插入排序,起到极大的优化。
3、希尔排序的时间复杂度不好计算,因为gap的取值方法不确定,大约为O(n*1.3)。
4、稳定性:不稳定。