当前课程知识点:数据结构(下) > 第十二章 排序 > (c1) 希尔排序:Shell序列 > 12c1-1: 策略
同学们好。
在本章的最后一节也是这门课程的最后一节
我们来学习一种非常别致的排序算法
也就是希尔排序
希尔排序算法既有着悠久的历史
同时也仍然不失活力
该算法的别致之处在于
它不再是将输入
视作为一个一维的序列
而是将其视作为一个二维的矩阵
并且试图对矩阵的每一列
分别进行排序
如果矩阵当前的宽度为w
那么我们就将所有这w列
各自的排序总称为w-sorting
实际上每一次Shellsort排序的过程
都是由若干个宽度不同的
W-sorting构成的
如果矩阵的每一列都已经过排序
我们就称之为w-ordered
实际上矩阵最开始比较宽
w比较大
此后Shellsort会逐步的压缩矩阵
使之越来越高越来越窄
每压缩一次都随机执行一趟
对应的w-sorting
从而使之变成W-ordered
我们也可以通过这样的一组图
来说明这一过程
比如这可能就是最初的那个矩阵
相应的比较宽比较矮
那么在执行完对应的Wk-sorting之后
Shellsort会对这个矩阵进行重组
使之成为一个相对更窄
但同时更高的矩阵
接下来对应于新的这个宽度
WK减1也会做一趟逐列的排序
而在此之后
Shellsort又会对它进行重组
使之变成这样一个更加的窄
更加高的矩阵
这个过程将持续的进行下去
总之矩阵会变得越来越高越来越窄
直到最终变成只有一列
同样的对最后这个矩阵
我们也需要来做一次对应的
W-sorting
只不过此时的W等于1
所以我们也称之为one-sorting
可以看到整个Shellsort的过程
使用了一系列的宽度
也就是WK Wk减1
以及一直到W3 W2和W1
这些宽度和在一起
构成了所谓的步长序列
step sequence
当然这些矩阵宽度被使用的次序
恰好与它们在序列中的次序相反
然而无论如何
它们都必须是逐个单调递减的
没错在算法的执行过程中
我们所采用的矩阵宽度
会逐步的递减
所以希尔排序算法
也称作为递减增量法
请注意我们这里的步长序列h
实际上除了我们刚才所说的单调性
以及它的首项必须为一
我们对它暂时还没有更多的要求
是的
这种序列有很多种可能的选择
采用不同的步长序列
Shellsort的性能也会有所不同
实际上Shellsort只是一个框架
你采用什么样的步长序列
就会得到什么样的算法
从这个意义上讲Shellsort
就像一个播放机
你往里头放入什么样的CD
它就会播放什么样的音乐
因此我们宁愿说Shellsort是一个算法
不如说它是一类算法
我们注意到既然任何步长序列
都要求首项W1等于1
所以任何Shellsort
都是以one-sorting结束的
而任何一次这样的one-sorting
其实也就相当于全局的排序
因此最终的输出结果
也必然是正确的排序序列
因此这个算法的正确性
是毫无疑问的
当然至此你可能会有一个疑问
既然无论如何
最终都要做一次one-sorting
那么此前的这些排序又有什么意义呢
是的
这正是Shellsort的奥妙所在
不过现在回答这个问题
还为时尚早
接下来我们不妨通过一个具体的实例
首先来切实的感受一下
希尔排序的执行过程
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试