希尔排序
希尔排序是插入排序的优化版本,通过分组插入排序逐步减少逆序对,最终完成全局排序。
希尔排序(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
