版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shanghx_123/article/details/83110396
希尔排序
- 基本思想:希尔排序是插入排序的一个变种。不同之处在于我们按步长gap分组,对每组的记录采用直接插入排序,随着步长的逐渐减少,分组包含的记录越来越多,直到gap=1时,构成了一个有序记录。
- 时间复杂度: O(n^1.25) ~ 1.6*O(n^1.25)
- 空间复杂度: O(1)
- 稳 定 性 :不稳定
- 适用场景:数据量较大
下图中为了方便,对gap以gap/2来计算,但最优的算法是gap/3+1。
void ShellSort(int* arr, int size)
{
if (arr == NULL || size <= 0)
return;
int gap = size;//gap为增量
while (gap > 1)
{
gap = gap / 3 + 1;//这样给是最优的
for (int idx = gap; idx < size; ++idx)
{
int end = idx - gap;//分组后,当前元素的前一个元素
int key = arr[idx];//保存当前元素
//按升序排序
while (end >= 0 && arr[end] > key)
{
arr[end + gap] = arr[end];
end -= gap;
}
arr[end + gap] = key;
}
}
}