希尔排序虽然是直接插入排序的升级版本,和插入排序有着相同的特性,即原始数组有序度越高则算法的时间复杂度越低(预排序机制),但是是不稳定排序算法。
为了降低算法的时间复杂度,所以我们需要在排序之前尽可能提高数组的有序度。
希尔排序定义一个间隔变量gap,对待排序数组进行分组,将下标间隔为gap的多个数组分为一组,每次遍历都只对组内数据进行排序,然后降低gap,重复上述分组排序,最后gap==1,便是进行直接插入排序,但此时待排序数组的有序度已经很高了,故最后一次排序的时间复杂度接近于。
gap的取值可以自定义,通常会使用进行取值。
希尔排序的时间复杂度难以精确统计,与gap的取值算法和原始数组的有序性强相关,而我们算法经大量实验研究得希尔排序的时间复杂度为~。
void ShellSort(int* arr, int n)
{
int gap = n;
while (gap > 1)
{
gap = gap / 3 + 1;
int i = gap;
for (; i < n; ++i)
{
int j = i;
int end = arr[j];
while (j >= gap && arr[j - gap] > end)
{
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = end;
}
}
}