希尔排序
本页面将简要介绍希尔排序。
定义
希尔排序(英语:Shell sort),也称为缩小增量排序法,是 插入排序 的一种改进版本。希尔排序以它的发明者希尔(英语:Donald Shell)命名。
过程
排序对不相邻的记录进行比较和移动:
- 将待排序序列分为若干子序列(每个子序列的元素在原始数组中间距相同);
- 对这些子序列进行插入排序;
- 减小每个子序列中元素之间的间距,重复上述过程直至间距减少为
。
性质
稳定性
希尔排序是一种不稳定的排序算法。
时间复杂度
希尔排序的最优时间复杂度为
希尔排序的平均时间复杂度和最坏时间复杂度与间距序列的选取有关。设间距序列为
命题
命题
为证明这两个命题,我们先给出一个重要的定理并证明它,这个定理反应了希尔排序的最主要特征。
定理
证明:
我们先证明一个引理:
引理
:对于整数 、正整数 与两个数组 ,满足如下要求: 则我们将两个数组分别升序排序后,上述要求依然成立。
证明:
设数组
排序完为数组 ,数组 排序完为数组 。 对于任何
, 小等于数组 中的 个元素,也小等于数组 中的 个元素(这是因为 与 的元素可重集合是相同的)。 那么在可重集合
中,大等于 的元素个数不超过 个。 进而小于
的元素个数至少有 个,取出其中的 个,设它们为 。于是有: 所以
至少大等于 也即 中的 个元素,那么自然有 。 证毕
再回到原命题的证明:
我们实际上只需要证明调用完
执行完
而之后执行
对于每个
第二个组前面也加上“
则第二个组就是引理
又因为有:
所以由引理
若有
综合以上论述便有:执行完
得证。
证毕
这个定理揭示了希尔排序在特定集合
接下来我们单拎出来一个数论引理进行证明。这个定理在 OI 界因 小凯的疑惑 一题而大为出名。而在希尔排序复杂度的证明中,它也使得定理
引理
:若 均为正整数且互素,则不在集合 中的最大正整数为 。 证明:
分两步证明:
先证明方程
没有 均为非负整数的解: 若无非负整数的限制,容易得到两组解
。 通过其通解形式
,容易得到上面两组解是“相邻”的(因为 )。 当
递增时, 递增, 递减,所以如果方程有非负整数解,必然会夹在这两组解中间,但这两组解“相邻”,中间没有别的解。 故不可能有非负整数解。 - 再证明对任意整数
,方程 有非负整数解: 我们找一组解
满足 (由通解的表达式,这可以做到)。 则有:
所以
,又因为 ,所以 ,所以 。 所以
为一组非负整数解。 综上得证。
证毕
而下面这个定理则揭示了引理
定理
证明:
对于
故以下假设
对于任意的正整数
又因为
即得:
由定理
与
综合以上既有:
所以对于任何
在 Shell-Sort 伪代码中
证明完对于每个
得证。
证毕
认真观察定理
有了这两个定理,我们可以命题
先证明命题
证明:
将
Shell-Sort 执行顺序为:
分两部分去分析复杂度:
-
对于前面的若干个满足
的 ,显然有 的时间复杂度为 。考虑对最接近
的项 ,有:而对于
的 ,因为有 ,所以可得:所以大等于
部分的总时间复杂度为: -
对于后面剩下的满足
的项,前两项的复杂度还是 ,而对于后面的项 ,有定理 可得时间复杂度为:再次利用
性质可得此部分总时间复杂度为(下式中 沿用了上一种情况中的含义):
综上可得总时间复杂度即为
证毕
再证明命题
证明:
注意到一个事实:如果已经执行过了
更进一步:如果已经执行过了
不断归纳,就可以得到:如果已经执行过了
接下来分为两部分分析复杂度:
-
对于
的部分,则执行每个 的复杂度为 。而
,所以单词插入排序复杂度为 。而这一部分元素个数是
级别的,所以这一部分时间复杂度为 。 -
对于
的部分,因为 ,所以这之前已经执行了 与 ,于是执行 的时间复杂度是 。还是一样的,这一部分元素个数也是
级别的,所以这一部分时间复杂度为 。
综上可得总时间复杂度即为
证毕
空间复杂度
希尔排序的空间复杂度为
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
参考资料与注释
本页面最近更新:2023/10/4 21:50:08,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:NachtgeistW, Alisahhh, CroMarmot, Enter-tainer, iamtwz, Menci, partychicken, Peanut-Tang, shawlleyw, ShwStone, Tiphereth-A, Xeonacid
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用