Python希尔排序算法详解与实现 - 编程教程
- Python
- 2025-07-27
- 262
Python希尔排序算法详解
从原理到实现,全面掌握高效排序算法
希尔排序算法介绍
什么是希尔排序?
希尔排序(Shell Sort)是插入排序的一种高效改进版本,也称为"缩小增量排序",由Donald Shell于1959年提出。该算法通过将原始列表分割成多个子序列进行插入排序,然后逐步减少子序列的数量,最终对整个列表进行一次插入排序。
算法核心思想
- 将列表按一定间隔(gap)分组
- 对每个分组进行插入排序
- 逐步缩小间隔直至为1
- 最后进行一次完整的插入排序
希尔排序的特点
- 高效性:比简单插入排序高效得多
- 原地排序:不需要额外的存储空间
- 不稳定排序:相同元素可能改变相对位置
- 增量序列:性能取决于选择的间隔序列
时间复杂度
- 最佳情况:O(n log n)
- 平均情况:取决于间隔序列
- 最坏情况:O(n²)
希尔排序步骤详解
步骤 1: 选择初始间隔
通常取列表长度的一半作为初始间隔(gap)。例如,对于长度为8的列表,初始gap=4。
步骤 2: 分组并排序
将列表分成gap个子序列,每个子序列由间隔gap的元素组成。对每个子序列进行插入排序。
步骤 3: 缩小间隔
减少gap值(通常为之前值的一半),重复步骤2的分组和排序过程。
步骤 4: 最终插入排序
当gap减少到1时,对整个列表执行一次插入排序,此时列表基本有序,插入排序效率很高。
排序过程可视化
初始数组: [9, 8, 7, 6, 5, 4, 3, 2, 1]
- gap=4: 分组为 [9,5,1], [8,4], [7,3], [6,2] → 排序后 [1,4,3,2,5,8,7,6,9]
- gap=2: 分组为 [1,3,5,7,9], [4,2,8,6] → 排序后 [1,2,3,4,5,6,7,8,9]
- gap=1: 对整个数组插入排序 → 最终排序完成
Python实现希尔排序
def shell_sort(arr): """ 希尔排序算法的Python实现 参数: arr (list): 待排序的列表 返回: list: 排序后的列表 """ n = len(arr) # 初始间隔取列表长度的一半 gap = n // 2 # 当间隔大于0时持续循环 while gap > 0: # 对每个子序列进行插入排序 for i in range(gap, n): # 保存当前元素值 temp = arr[i] j = i # 对子序列进行插入排序 while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap # 将保存的值插入到正确位置 arr[j] = temp # 缩小间隔 gap //= 2 return arr # 测试希尔排序 if __name__ == "__main__": test_array = [33, 12, 56, 9, 23, 45, 87, 3, 67, 21] print("排序前:", test_array) sorted_array = shell_sort(test_array.copy()) print("排序后:", sorted_array)
代码解析
- gap初始化:初始间隔设为数组长度的一半
- 外层循环:控制间隔的逐步缩小,直到间隔为1
- 内层循环:对每个间隔形成的子序列执行插入排序
- 插入排序:将元素插入到子序列的正确位置
- 间隔缩小:每次循环后将间隔减半
代码测试结果
输入数组: [33, 12, 56, 9, 23, 45, 87, 3, 67, 21]
输出数组: [3, 9, 12, 21, 23, 33, 45, 56, 67, 87]
排序过程:
- gap=5: 分组排序
- gap=2: 分组排序
- gap=1: 最终插入排序
希尔排序算法分析
优点
- 比简单插入排序高效得多,特别是对于中等大小的列表
- 不需要额外的内存空间(原地排序)
- 对于部分有序的数组效率很高
- 算法简单,易于实现
缺点
- 不稳定排序算法(相同元素可能改变相对位置)
- 时间复杂度依赖于间隔序列的选择
- 对于非常大的数据集,不如快速排序、归并排序等高效
适用场景
- 中等规模数据集的排序
- 内存受限的环境
- 嵌入式系统等资源有限的环境
- 作为更复杂算法的基础或子过程
时间复杂度对比
排序算法 | 最佳情况 | 平均情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|---|
希尔排序 | O(n log n) | 取决于间隔序列 | O(n²) | O(1) |
插入排序 | O(n) | O(n²) | O(n²) | O(1) |
快速排序 | O(n log n) | O(n log n) | O(n²) | O(log n) |
归并排序 | O(n log n) | O(n log n) | O(n log n) | O(n) |
总结
希尔排序是一种高效的插入排序改进算法,通过分组排序的方式显著提高了排序效率。它特别适合中等规模的数据集排序,在内存受限的环境中表现优异。
关键要点
- 希尔排序基于插入排序,但通过分组策略提高效率
- 算法的核心是间隔(gap)序列的选择
- 时间复杂度在O(n log n)到O(n²)之间
- 是原地排序算法,空间复杂度为O(1)
- 不稳定排序,但实际应用中通常可以接受
学习建议: 理解希尔排序的最好方式是自己手动模拟排序过程,尝试不同间隔序列,并比较不同规模数据下的排序效率。
算法性能提升
5-10x
比插入排序快
O(1)
空间复杂度
希尔排序是第一个突破O(n²)时间复杂度的排序算法,具有重要的历史意义。
本文由MengFanDan于2025-07-27发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20256627.html
发表评论