上一篇
希尔排序算法详解及Python实现 | 排序算法教程
- Python
- 2025-07-15
- 418
希尔排序算法详解及Python实现
高效排序算法的原理、实现与应用
什么是希尔排序?
希尔排序(Shell Sort)是插入排序的一种高效改进版本,也称为"缩小增量排序"。该算法由Donald Shell于1959年提出,是第一批突破O(n²)时间复杂度的排序算法之一。
核心思想:希尔排序通过将原始数组分解为多个较小的子序列,分别进行插入排序,随着增量逐渐减少,子序列越来越长,最终当增量为1时,整个数组被当作一个序列进行插入排序。
希尔排序工作原理
希尔排序的执行过程可以分为以下步骤:
- 选择增量序列:确定一个增量序列,通常初始增量为数组长度的一半,然后逐步减半直到增量为1
- 分组排序:按照当前增量将数组元素划分为若干子序列,对每个子序列进行插入排序
- 减小增量:减小增量值,重复分组排序过程
- 最终排序:当增量减小到1时,对整个数组进行最后一次插入排序
增量序列示例:16个元素的数组
增量序列:8 → 4 → 2 → 1
每次增量减半,直到增量为1
希尔排序示例演示
以下是对数组 [9, 8, 1, 7, 5, 3, 4, 6, 2] 进行希尔排序的步骤:
增量(gap) | 分组情况 | 排序后数组 |
---|---|---|
初始数组 | - | [9, 8, 1, 7, 5, 3, 4, 6, 2] |
gap=4 | (9,5,2), (8,3), (1,4), (7,6) | [2, 3, 1, 6, 5, 8, 4, 7, 9] |
gap=2 | (2,1,5,4,9), (3,6,8,7) | [1, 3, 2, 6, 4, 7, 5, 8, 9] |
gap=1 | 整个数组 | [1, 2, 3, 4, 5, 6, 7, 8, 9] |
希尔排序Python实现
下面是希尔排序算法的完整Python实现代码:
def shell_sort(arr): """ 希尔排序算法实现 :param arr: 待排序的列表 :return: 排序后的列表 """ n = len(arr) # 初始增量gap为数组长度的一半 gap = n // 2 # 循环直到gap为0 while gap > 0: # 从gap位置开始,对每个子序列进行插入排序 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值 gap //= 2 return arr # 测试希尔排序 if __name__ == "__main__": data = [9, 8, 3, 7, 5, 6, 4, 1, 2] print("原始数组:", data) sorted_data = shell_sort(data) print("排序后数组:", sorted_data)
算法复杂度分析
时间复杂度
- 最好情况:O(n log n)
- 平均情况:取决于增量序列,一般为O(n log²n)
- 最坏情况:O(n²)
空间复杂度
O(1) - 希尔排序是原地排序算法
稳定性
不稳定 - 相同元素可能改变相对顺序
希尔排序的优缺点
优点
- 比简单插入排序和冒泡排序高效
- 对于中等大小的数组表现良好
- 空间复杂度低(原地排序)
- 代码实现相对简单
- 不需要额外的内存空间
缺点
- 时间复杂度分析复杂
- 增量序列的选择会影响性能
- 在最坏情况下时间复杂度为O(n²)
- 不是稳定排序算法
- 对于大型数据集不如快速排序或归并排序高效
希尔排序应用场景
希尔排序在以下场景中特别有用:
- 中小规模数据排序
- 需要避免使用递归的场景
- 内存受限的环境
- 嵌入式系统开发
- 对稳定性要求不高的场景
- 作为更复杂排序算法的子过程
- 需要简单实现的排序需求
- 算法教学和学习场景
希尔排序在工业级应用中并不常见,但它是理解高级排序算法的重要基础!
希尔排序算法教程 | 排序算法学习资源
本文由SikongMoNu于2025-07-15发表在吾爱品聚,如有疑问,请联系我们。
本文链接:http://pjw.521pj.cn/20255677.html
发表评论