(c3)希尔排序:更佳的序列

官官方信息技术老师·18 页·深入(追求细节与边界)·0 次浏览·38 天前
希尔排序增量序列逆序对定理K

希尔排序:更佳的序列

看完你能说清邮资问题、逆序对如何决定增量序列的性能上限

按 空格/→ 演示下一步

问一句
1 / 18 页

全部页面点击任意一页,跳回舞台从这页播放

希尔排序增量序列逆序对定理K

希尔排序:更佳的序列

看完你能说清邮资问题、逆序对如何决定增量序列的性能上限

1第 1 页 · 希尔排序:更佳的序列

序列问题是什么

上一页我们看到:希尔排序的框架是固定的——按间隔分组做插入排序,间隔逐轮缩小到 1。但间隔每轮取多少、怎么缩小,框架并没有规定。这个自由度,正是本节要解决的问题。

框架已定
分组插入 + 间隔递减至 1,流程不因序列而改变
序列待定
各轮间隔的取值(增量序列)是算法唯一的自由度
性能攸关
序列好坏直接决定轮数与比较次数,最坏可退化为 O(n²)
炒菜的火候对应 →增量序列

大火收汁后转小火;每档火候的安排决定菜能不能炒好

2第 2 页 · 序列问题是什么

好序列的评判标准

这棵思维导图列出评判增量序列好坏的四个维度,从左到右逐条展开,先看根再看分支。

图解渲染中…
互质性:相邻增量有公因子时,前面趟的排序成果会被浪费末项为1:最后一趟增量必须是1,否则无法保证完全有序递减性:增量逐趟减小,小增量趟受益于大增量趟的成果复杂度:好序列能把最坏情况压到 n^1.3 或更低量级
3第 3 页 · 好序列的评判标准

什么是逆序对

上一页我们说要给序列「减少混乱」,但混乱怎么量化?想想排队:前面的人比后面高,大家看着就别扭。这种「该在后面的却在前面」的组合,就是衡量乱程度的基本单位。

逆序对定义
下标 i<j 但 A[i]>A[j],位置在前值却更大的一对元素
有序 = 逆序对为 0
完全升序时任何 i<j 都有 A[i]≤A[j],逆序对数为零
衡量混乱程度
逆序对越多序列越乱;相邻交换一次最多消除一个逆序对
排队时的高矮顺序对应 →逆序对

队伍里前面的人比后面高,一对就是一组合

4第 4 页 · 什么是逆序对

数逆序对的例子

以小数组为例逐步找出所有逆序对

数逆序对的例子
以小数组为例逐步找出所有逆序对
5第 5 页 · 数逆序对的例子

逆序对与插入排序

上一页我们数过逆序对,它就是数组「乱的程度」。那排序到底在干什么?答案很干净:就是在消灭逆序对。而插入排序每交换一次,恰好只消掉一个。

排序的本质
排序就是把逆序对数量一路降到 0 的过程
相邻交换
插入排序元素一步步挪,每次只和相邻元素交换
一次消一个
相邻交换只影响这一对,恰好消去一个逆序对
代价下界
逆序对有几个,就至少要几次交换,躲不掉
排队让座对应 →插入排序交换

让插队的人一格格挪回去,每挪一格只解决一对冲突

I=∑i<j1[ai>aj],T=Θ(n+I)I=\sum_{i<j}\mathbf{1}[a_i>a_j],\quad T=\Theta(n+I)
6第 6 页 · 逆序对与插入排序

逆序对视角看希尔排序

从上往下读:每趟增量削减一批逆序对,越往下剩余越少,最后一趟几乎不用干活。

图解渲染中…
a1:按增量h分组,各组内做插入排序a5:增量取1时退化为普通插入排序
7第 7 页 · 逆序对视角看希尔排序

逆序对计数实现

python

用归并排序在 O(n log n) 内数出逆序对,量化序列好坏。

代码高亮加载中…

归并时三处计数相加:左半内部、右半内部、跨越中线的逆序对;右半元素落位时,左半剩余个数一次性统计,避免逐对比较。

8第 8 页 · 逆序对计数实现

邮资问题是什么

上一页我们看完了几种经典的增量序列,但你可能好奇:为什么 3h+1 这样的序列特别受推崇?这要从一个看似无关的老问题说起——邮票怎么贴,才能恰好凑出某个邮资。

问题设定
给定若干邮票面额,问恰好凑出目标邮资的方法
关键条件
不许多贴也不许少贴,总额必须分毫不差
追问
哪些面额组合能凑出所有金额?哪些总会留下缺口?
邮票凑邮资对应 →增量序列覆盖

邮票面额对应增量步长,能否凑齐所有金额对应能否均匀打乱全表

n=a1x1+a2x2+⋯+akxk(xi≥0)n = a_1 x_1 + a_2 x_2 + \cdots + a_k x_k \quad (x_i \ge 0)
9第 9 页 · 邮资问题是什么

邮资问题的求解过程

用 3 分和 4 分邮票凑出 14 分,一步步看组合如何构造出来。

1
明确目标
要凑 14 分,票面只有 3 分和 4 分,求一组非负解 3a+4b=14
2
先试大票
贪心思路:尽量多用 4 分,14÷4 余 2,凑不出
3
退一步换
少用一张 4 分,剩 10 分分给 3 分票,余 1,仍不行
4
再降一级
用两张 4 分,剩 6 分正好是两张 3 分,可行
5
验证组合
4+4+3+3=14,且邮票张数最少,确认最优
10第 10 页 · 邮资问题的求解过程

邮资问题的启示

前面算过:1、5、12、19 这组邮票面值,在限额内几乎每个金额都能凑出——面值组合的“覆盖能力”是设计出来的。增量序列也一样:h 取哪些值,决定了哪些间隔的逆序对能被提前消掉。

覆盖 = 组合出所有金额
邮票面值设法把 1..N 每个数都表示出来,不留死角
增量序列也在做覆盖
h 序列要覆盖各种间隔,让相距很远的逆序对也有机会被消除
缺口就是盲区
面值缺 2 就凑不出某些数;增量漏掉某类间隔,对应的逆序对只能靠最后的 1-排序硬扛
互质带来更好覆盖
Hibbard 的 2^k−1 增量两两互质,不同间隔配合起来覆盖更均匀
邮票面值组合对应 →增量序列

面值要凑出所有金额,增量要消掉所有间隔的逆序对

11第 11 页 · 邮资问题的启示

邮资思路 vs 简单折半

两者都为希尔排序造增量序列,但出发点完全不同:一个凭几何直觉,一个靠计数证明。

邮资思路(Hibbard)
  • 出发点:覆盖所有可能的间隔需求
  • 增量形如 2^k−1,相邻约两倍关系
  • 性质:可证明约 O(n^1.5) 上界
简单折半(Shell 原始)
  • 出发点:直觉上快速缩小间隔即可
  • 增量 n/2, n/4, …,相邻严格两倍
  • 性质:最坏可退化到 O(n²)
当关心最坏情况保证时选邮资序列;折半序列因增量互除会产生二次方退化,只宜作教学起点。
12第 12 页 · 邮资思路 vs 简单折半

定理K的陈述

邮资问题给了我们灵感:只用 2 的幂的倍数,硬币系统才「顺畅」。希尔排序的序列也一样挑剔——有一个著名定理(Pratt,1971)告诉我们什么样的序列能把界压到 O(N^{3/2})。

定理内容
若增量序列各增量互为倍数关系(如 2^p·3^q),则总步数 O(N^{3/2})
满足条件
每趟排序前,用上一增量排过的结果仍是 h-有序的
为何有效
前一趟的有序性不丢失,每趟只产生约 O(N) 个新的 h-逆序对
代价与权衡
趟数变为 O(log²N),换取每趟线性工作量,总界 O(N log²N)
接力赛交接棒对应 →增量保持有序

前一棒建立的领先优势(有序性)交棒时不丢,下一棒只需小步巩固

\text{Pratt 序列(2^p 3^q)} \;\Longrightarrow\; \text{总耗时} = O(N^{3/2}) \;(实际更接近 O(N\log^2 N))
13第 13 页 · 定理K的陈述

定理K证明思路

定理K的证明拆成四步:每步只依赖前一步的观察,逐层逼近结论。

1
划分数列
把增量序列分成相邻增量对 (h_k, h_{k+1}),逐对分析
2
固定一对研究
只看一个 h-排序后又被 h'-排序的数组,设 h' > h
3
计数关键量
证明 h'-排序后,每个元素与 h 距离内的逆序对至多剩常数个
4
乘增量求和
把每对增量的界相乘累加,得整体 O(N^{3/2}) 上界
14第 14 页 · 定理K证明思路

定理K与逆序对的联系

左上顺主干:定理K条件如何一路转化为逆序对被高效削减;右下分支展示条件被破坏时的最坏结局。

图解渲染中…
d1:h排序不动小间隔元素,新逆序只由更小趟补充h1:例:1,2,4,8序列在特定输入下退化
15第 15 页 · 定理K与逆序对的联系

自测:序列的取舍

点击作答

关于希尔排序增量序列的条件,下列说法正确的是?

16第 16 页 · 自测:序列的取舍

要点收束

  • ✓逆序对数是插入排序成本的可视化账本
  • ✓希尔排序每轮大幅消解逆序对,后续轮变轻松
  • ✓邮资问题引出「可达增量序列」的设计约束
  • ✓定理K保证:相邻增量互素时计数下界更优
  • ✓好序列=每轮消得多,且轮间留有长程交换能力
延伸主题:Sedgewick 增量序列详解tokuda 序列与实验对比希尔排序复杂度证明现状
17第 17 页 · 要点收束

课后思考

三个问题,先自己想五分钟,再看参考答案。

1为什么一次 h 排序能顺手消掉大量不同步长下的逆序对?

参考答案思考路径:h 排序后,任意间隔为 h 倍数的位置对都逆序消除;相邻步长结构互相“借力”。回想逆序对视角那页,看小步长如何继承大步长的成果。

2如果你要为一份真实数据设计增量序列,会优先考虑哪些因素?

参考答案没有唯一答案。可考虑:数据规模与大致有序程度、步长间最好互质(避免重复比较)、最坏情形上界(如定理K的 1,4,13 序列)、实现的简单性。

3定理K对 1、4、13 序列给出上界,换成其他序列它还成立吗?边界在哪?

参考答案不成立。证明关键用到 4 与 13 的特定整除关系(如 13=3×4+1);换序列需重新推导。思考:互质步长为何破坏原有论证,邮资问题的启示又如何迁移。

18第 18 页 · 课后思考