当前课程知识点:数据结构(下) > 第十二章 排序 > (a1)快速排序:算法A > 12a1-4: 单调性 + 不变性
以下就让我们通过这样一组插图
更为细致的考察和理解
轴点构造算法的原理及其具体过程
在这个过程中我们需要把握
两条核心的不变性
首先正如我们此前所言
从数值上来看
子序列l中的元素都不超过轴点候选
同时子序列g中的元素
也都不小于轴点候选
其次对于子序列u而言
它的首元素和末元素
总是交替的在逻辑上可以视作为
空闲单元
我们首先来验证初始状态
比如在初始状态下
无论l或g都是空的
所以第一条自然满足
同样在出使条件下U的首元素
已经作为轴点的候选被取出备份
因此它的确可以认为是空闲的
再来考察一般情况下的U
它的首元素为lo而末元素为hi
不是一般性假设此时的lo是空闲的
于是我们就可以尝试着
向左侧拓展子序列g
具体来说只要当前U的末元素
也就是hi在数值上不小于候选轴点
我们就可以简明的
通过令hi递减一个单位
从而将元素hi归入到子序列g中
接下来如果新的末元素
依然满足这样的条件
我们就继续将它归入到g中
直到某个时刻末元素hi
不再满足这个条件
也就是说此时的元素hi
在数值上会严格的小于候选轴点
没错严格小于候选轴点
这不正是子序列l
所对应的入选条件吗
因此在这种情况下
我们不妨将末元素hi
转移致当前仍然空闲的单元lo中
尽管因此单元lo将不再是空闲的
但相应的hi
所腾出的那个单元
又会随即变成空闲的
也就是说U所具有的不变性
依然成立
我们接下来的处理方向
将与刚才恰好颠倒过来
也就是说我们会进而去考察
U的首元素
只要这个元素在数值上不超过候选轴点
我们就可以同样简明的
令lo递增一个单位
从而将这个首元素归入到子序列L中
子序列L也会因此向后端拓展一个单元
以下同理只要首元素在数值上
依然不超过侯选轴点
我们都会同样的将它归入到子序列L中
这样的情况出现多少次
子序列L就会向后拓展多少个单元
子序列L的这种拓展
会在什么时候终止呢
没错
也就是接下来的首元素lo
在数值上不再是继续的
不超过侯选轴点
而这意味着什么呢
没错
这意味着此时的首元素lo
完全符合子序列g的入选条件
因此我们不妨将它转移到
当前仍是空闲的那个单元hi中
而此后呢尽管单元hi不再是空闲的
但是随着刚才那个元素的移出
单元lo又随即变成是空闲的了
也就是说U的不变性依然成立
当然在经过以上的拓展之后
无论是子序列L还是子序列G
在数值上也依然保持不变性
至此整个算法经历了一个完整的周期
经过这样的一个周期
不仅不变性依然保持
而且更重要的是
我们可以注意到这里的单调性
更准确的讲是子序列长度的单调性
因为我们看到子序列L和G的长度
都有所增加
同时相应的子序列U的长度
却在无形中缩短了
因此当最终子序列U
退化为只有一个单元时
也就是霍尔爵士所设想的
算法终止之前的临界状态
到那个时候我们只需将侯选轴点
植入于唯一的这个空闲单元
它就会成为一个名副其实的轴点
同时我们也完成了
对原序列的一次快速划分
整个partition算法也可顺利结束
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试