当前课程知识点:数据结构(下) > 第十二章 排序 > (c2)希尔排序:逆序对 > 12c2-3: 逆序对
现在还是回到我们的线性组合
考察我们的待排序序列
如果它既是g-ordered
同时也是h-ordered
这样的序列也称作是
g h-ordered
实际上这样的序列也必然会以
G和H之和为步长是有序的
我们可以通过这个图
来简明的证明这一点
在整个序列中考察任何一对
相距g加上h的元素
我们说它们必然是顺序
因为我们可以找到
居于它们中间的
这样一个特定的元素
这个元素到前一元素的距离为g
而到后一元素的距离为h
于是以这个中间元素为桥梁
根据不等式的单项传递性
我们自然就可以得知
这一对间隔为g加h的元素
也必然是顺序的
实际上这个结论也可以进一得推广到
g和h的任何一个线性组合
我们仍然通过这组图来加以说明
在这个序列中
我们考察任何一对间距为
这个线性组合的元素
为了证明这一对元素之间的顺序性
我们无非是将刚才的方法推而广之
也就是说
我们需要引入更多的中间桥梁
比如这里给出的就是一种具体的方案
我们首先以g为间隔
连续的取出m个元素
在这些间隔位置上的所有元素
必然是单调非降的
接下来我们在以h为间隔
连续的取出n个元素
同样的这n个元素
也必然是单调非降的
于是通过所有这些单项不等号的串接
我们也就自然的证明了
这样一对元素之间的顺序性
由以上我们可以概括出一个结论
也就是凡是间距
可以表示为线性组合的
任何一对元素必然是顺序的
简而言之凡能表示为线性组合
则必然顺序
现在我们将注意力集中于序列中
秩为i的那个元素
如果g和h是互素的
而且整个序列已经是
同时关于g和h有序的
那么相对于这个元素
哪些元素必然是顺序的
反过来哪些元素才有可能是逆序的
我们说实际上可能逆序的元素不会很多
确切的讲无非就是刚才
关于g和h的那个x的
也就是不能由g和h线性组合
生成的那个最大的整数
你能看出其中的原因吗
没错
对于这个区间之后的
任何一个元素而言
它与i的距离已经超出了
那个最大的预值x
所以它们之间的间隔
也必然可以表示为g和h的线性组合
而我们刚刚总结过
凡是能够表示为线性组合的
也就是顺序
反过来这也就意味着
i这个元素所能参与构成的逆序对
只可能出现与这样一个范围
而随着希尔排序的不断迭代
这个范围也会不断的缩小
没错
逆序列的总数会不断持续的减少
因此你能想到点什么吗
没错
插入 排序
我们知道
插入排序具有输入敏感性
它的实际运行时间将线性正比于
序列中所含逆序对的总数
至此我们终于弄明白了
为什么在希尔排序的底层
我们更加倾向于使用
插入排序算法
实际上按照以上的优化思路
后人针对希尔排序
曾经涉及过许多更为优化的步长序列
比如PS序列
Pratt序列
以及Sedgewick序列
关于这些序列的详细介绍
及其性能分析
详见我们的教材以及习题解析
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试