- 1 基本数据结构
- 2 栈的概念
- 3 栈的抽象数据类型
- 4 栈的实现
- 5 栈的应用之圆括号平衡
- 6 栈的应用之符号平衡(通用)
- 7 栈的应用之进制转换
- 8 栈的应用之中缀前缀后缀
- 9 中缀后前缀、后缀的转换思路
- 10 栈的应用之中缀转后缀表达式算法的实现
- 11 后缀表达式求值
- 12 队列的概念
- 13 队列的抽象数据类型
- 14 队列的 python 实现
- 15 队列应用之烫手的山芋
- 16 队列应用之 打印任务
- 17 列表
- 18 无序列表的实现
- 19 有序列表 ADT 及实现
- 20 递归和递归三定律
- 21 递归的实现和应用
- 22 递归图形
- 23 宾斯基三角形
- 24 汉诺塔问题(河内塔问题)
- 25 探索迷宫
- 26 动态规划
- 27 排序与查找 顺序查找
- 28 二分查找
- 30 冒泡排序
- 31 选择排序
- 29-1 哈希查找
- 29-2 冲突解决
- 29-3 用哈希表实现映射
- 32 插入排序
- 33 希尔排序
- 34 归并排序
- 35 快速排序
- 36 树的基本概念
- 37 树的实现
- 38 分析树
- 39 树的遍历
33 希尔排序
希尔排序
希尔排序,有时称为递减增量排序,是在插入排序基础上,把列表拆成几个较小的子表,然后对每个子表使用插入排序的方法。选出子表的方法是希尔排序的关键,它并不是把列表的中相近的元素取出来组成子表,而是使用了一个增量值 I,有时也叫做“间隙”,然后每隔一个间隙选中一个元素来组成子表。
这可以从图 6 中看出来,列表中有 9 个元素,如果我们使用增量 3,就有 3 个子表,每个子表单独做插入排序。完成之后的列表如图 7,现在看这个表虽然没有完全排序,但对子表排序后,元素已经很接近它们的最终位置。
图 6 增量为 3 的希尔排序
图 7 子表排序之后的希尔排序
图 8 所示为增量是 1 的插入排序,或者说,这就是个标准的插入排序。得益于前面的子表排序过程,现在需要移动操作要少得多。在这个例子中,只需要移动 4 次就完成了排序。
图 8 希尔排序最后一步:增量为 1 的插入排序
图 9 希尔排序 初始化子表
前面我们说过,希尔排序的独特性就是增量的选择,下面的函数使用了一个不同的增量的集合,从 n/2 个子表开始,下一步就是 n/4 个子表要排序,最终是 1 个子表进行插入排序。图 9 所示是这种增量的第一批 4 个子表。
下面的 shellSort 函数对每个增量值进行一次子表排序,最终使用插入排序完成
def shellSort(alist): sublistcount = len(alist)//2 while sublistcount > 0: for startposition in range(sublistcount): gapInsertionSort(alist,startposition,sublistcount) print("After increments of size",sublistcount, "The list is",alist) sublistcount = sublistcount // 2 def gapInsertionSort(alist,start,gap): for i in range(start+gap,len(alist),gap): currentvalue = alist[i] position = i while position>=gap and alist[position-gap]>currentvalue: alist[position]=alist[position-gap] position = position-gap alist[position]=currentvalue alist = [54,26,93,17,77,31,44,55,20] shellSort(alist) print(alist)
乍看起来,希尔排序不见得比插入排序更好,因为最后一步就完全是一个插入排序。但是,最后一步的插入排序,不需要很多步骤来完成比较和移动,因为通过前面的增量插入排序,列表已经做了“预排序”,也就是说,这个列表已经比普通列表“更有序”,所以在效率上有很大的不同。
对希尔排序的详细分析超出本书的范围,不过我们可以说,它趋向于O(n) 和 O(n2) 之间。对 listing5 中的增量,性能是O(n2),变更增量,例如使用 2k−1 (1, 3, 7,15, 31, 等),性能可达到O(n3/2).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论