从智能仓储到工业现场:南京码讯光电工业无线通信方案保障AGV与巡检机器人稳定在线
2026/8/4 9:28:45
希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,其核心思想是通过引入“增量”来改进直接插入排序在处理大规模无序数据时效率低下的问题。它由Donald Shell于1959年提出,因此得名。
基本概念与原理:
该方法的优势在于:早期的大步长移动使得远距离元素能快速接近目标位置,显著减少总的比较和移动次数。
示例过程详解(增量序列:5, 3, 1)
原始数组:[48, 37, 64, 96, 75, 12, 26, 48, 54, 03]
第一趟(增量 = 5)
[12, 26, 48, 54, 03, 48, 37, 64, 96, 75]第二趟(增量 = 3)
[12, 03, 48, 37, 26, 48, 54, 64, 96, 75]第三趟(增量 = 1)
[03, 12, 26, 37, 48, 48, 54, 64, 75, 96]特点总结:
代码实现参考(完整版):
defshell_sort(arr):n=len(arr)gap=n//2# 初始增量whilegap>0:foriinrange(gap,n):temp=arr[i]j=i# 在同一增量组内进行插入排序whilej>=gapandarr[j-gap]>temp:arr[j]=arr[j-gap]j-=gap arr[j]=temp gap//=2# 缩小增量# 示例使用data=[48,37,64,96,75,12,26,48,54,3]shell_sort(data)print(data)# 输出: [3, 12, 26, 37, 48, 48, 54, 64, 75, 96]希尔排序的性能在很大程度上依赖于所采用的增量序列(gap sequence)。不同的增量序列会显著影响算法的时间复杂度和实际运行效率。以下是几种常见的增量序列及其对性能的影响:
n//2, n//4, ..., 11, 3, 7, 15, 31, ...1, 5, 19, 41, 109, ...1, 4, 13, 40, 121, ...| 增量序列 | 最坏时间复杂度 | 平均性能 | 实现难度 | 推荐程度 |
|---|---|---|---|---|
| 原始希尔 | $ O(n^2) $ | 一般 | 简单 | ⭐⭐☆☆☆ |
| Hibbard | $ O(n^{3/2}) $ | 较好 | 中等 | ⭐⭐⭐☆☆ |
| Knuth | $ O(n^{3/2}) $ | 稳定 | 中等 | ⭐⭐⭐⭐☆ |
| Sedgewick | $ O(n^{4/3}) $ | 优秀 | 较难 | ⭐⭐⭐⭐⭐ |
选择合适的增量序列可以大幅提升希尔排序的效率。虽然所有版本都是基于“缩小增量”的思想,但好的增量序列能够:
✅推荐实践:对于一般用途,使用Knuth 序列或Sedgewick 序列能获得更优性能;教学或简单场景可用原始希尔增量。