希尔排序
希尔排序是插入排序的优化版本,通过分组插入排序逐步减少逆序对,最终完成全局排序。
希尔排序(Shell Sort)详解
1. 基本步骤
希尔排序是插入排序的优化版本,通过分组插入排序逐步减少逆序对,最终完成全局排序。
具体步骤:
- 选择增量序列(gap):通常初始取
gap = n/2
,之后每次减半(gap = gap/2
),直到gap = 1
。 - 分组插入排序:
- 对每个
gap
值,将数组分为gap
组,每组包含间隔为gap
的元素。 - 对每组进行插入排序(组内元素较少,排序效率高)。
- 逐步缩小 gap:重复上述过程,直到
gap = 1
时完成最后一次插入排序,此时数组已基本有序,插入排序效率极高。
示例(数组 [8, 3, 6, 2, 5, 9, 1, 7, 4]
):
gap = 4
:分组[8,5,4]
,[3,9]
,[6,1]
,[2,7]
→ 组内排序 →[4,3,1,2,5,9,6,7,8]
gap = 2
:分组[4,1,5,6,8]
,[3,2,9,7]
→ 组内排序 →[1,2,4,3,5,7,6,9,8]
gap = 1
:全局插入排序 →[1,2,3,4,5,6,7,8,9]
注意 间隔选取元素!
如何组内排序:插入排序(每遍历一个元素(每插入一个元素),就找到它合适的位置)
返回时,把它们依次放到原来的位置!!!
分组 [8,5,4], [3,9], [6,1], [2,7] → 组内排序 → [4,3,1,2,5,9,6,7,8],这是怎么计算的
希尔排序的中间状态可能比初始数组更乱,但通过逐步缩小 gap
,最终会趋于全局有序,逐步减少逆序对
2. 关键特性
特性 | 说明 |
---|---|
自适应性 | 部分优化:对初始有序数组效率较高(但不如纯插入排序敏感)。 |
原地性 | ✅ 是:仅需常数级额外空间(交换时临时变量)。 |
稳定性 | ❌ 否:分组插入可能导致相同元素跨组交换(如 [5a, 3, 5b] → [3, 5b, 5a] )。 |
比较性 | ✅ 是:基于元素比较和交换操作。 |
3. 性能分析
- 时间复杂度:
- 取决于增量序列(gap)。
- 最优:(O(n \log n))(如使用 Hibbard 增量序列)。
- 平均:(O(n^{1.3}))(经验值,数学证明复杂)。
- 最差:(O(n^2))(当
gap = 1
时退化为插入排序)。 - 空间复杂度:(O(1))(原地排序)。
4. 对比其他排序算法
算法 | 自适应性 | 原地性 | 稳定性 | 平均时间复杂度 |
---|---|---|---|---|
希尔排序 | 部分自适应 | ✅ | ❌ | (O(n^{1.3})) |
插入排序 | ✅ 高度自适应 | ✅ | ✅ | (O(n^2)) |
归并排序 | ❌ | ❌ | ✅ | (O(n \log n)) |
快速排序 | ❌ | ✅ | ❌ | (O(n \log n)) |
5. 适用场景
- 中等规模数据:比插入排序更快,但不如快速排序/归并排序。
- 内存敏感环境:因原地性适合嵌入式系统。
- 不要求稳定性时:如对原始顺序无要求的数值排序。
6. 为什么希尔排序不稳定?
反例:
数组 [5a, 2, 3, 5b, 1]
,gap = 2
:
- 分组
[5a, 3, 1]
和[2, 5b]
。 - 排序后
[1, 2, 3, 5b, 5a]
→5a
和5b
的相对顺序改变。
总结
希尔排序通过分组插入排序平衡了局部效率和全局优化,是一种高效的原地比较排序,但牺牲了稳定性。其性能高度依赖增量序列的选择,实际应用中常作为快速排序的补充(如内省排序的递归底层优化)。
[11,14,25,6,7,30,9,17,1]
【11,7,1】【14,30】【25,9】【6,17】
【1,7,11】【14,30】【9,29】【6,17】
【1,14,9,6,7,30,29,17,11】
【1,6,29】【14,7,17】【9,30.11】
【1,6,29】【7,14,17】【9,11 .30】
1 7 9 6 14 11 29 17 30
【1,9.14.29.30】【6. 7.11.17】
1 6 9 7 14 11 29 17 30
对于一个整数数组,想求出数组的最大连续和,不可以用( )
A
枚举
B
分治
C
动态规划
D
排序
正确答案:D
你的答案:C
官方解析:
A:可以枚举起点和终点然后对子数组求和,最后输出最大值,正确
B:最大连续和的子数组要么在左半区间,要么在右半区间,要么就是横跨了两个区间,可以分治,正确
C:设dp[i]表示以第i号元素结尾的最大连续和,最后输出dp数组中的最大值,正确
D:求的是数组的最大连续和,数字的顺序不能变,排序后改变了元素的顺序,错误
故选D