当前课程知识点:数据结构(下) > 第十二章 排序 > (a4)快速排序:变种 > 12a4-2: 单调性
实际上新的这个算法依然是
反复迭代式进行的
在每一步迭代中
我们考察的都是子序列U的首元素
也就是由当前的k所指示的那个元素x
我们将根据x的数值大小
将它归入到G或者L子序列当中
具体来说根据这个元素
与侯选轴点之间的数值大小
无非两种情况
首先如果这个元素不小于侯选轴点
我们就可以直接的拓展子序列G
这种情况在图中显而易见
既然x不小于侯选节点
所以它自然有资格
加入到子序列G中
因此我们只需简明的
将它归入到G中
请注意在这种情况下
L会保持不变
从代码实现的角度来看
这种情况也是非常好描述的
具体来说经过一次比较
即可判断是否属于这种情况
若果真属于这种情况
我们就简明的令k递增一个单位
令它指向原先的后继
从而隐式的完成
将元素x归入G中的功能
那么反过来如果当前的这个元素
要小于侯选轴点呢
自然的此时应该将这个x归入到
子序列L中
然而我们却发现此时的l
无论向左或向右都无法拓展
因此我们需要通过一种变通的方法
将x加入到L中
具体来说我们需要将子序列G
向后移动一个单元
从而等效于腾出一个空间
以便x能够转入其中
从而完成L向右的拓展
那么难道我们真的需要将G
整体的向右移动一个单元吗
当然如果你不考虑效率
这种方法固然是可行的
但实际上我们有更好的方法
来使G向后移动一个单元
只要学过初等的物理
你就应该知道
在沿着一个表面
移动物体时
我们有两种移动的方法
效率各自不同
当然这里的效率是指
在移动过程中所受到的阻力
或者说摩擦力
如果是整体的后移
也就相当于物理学上的平行移动
我们知道这种平行移动所遇到的摩擦力
是更大的
你应该记得
在这种情况下
你的物理老师曾经建议过你
改用滚动的方式
来替代平行移动的方式
没错
相对而言滚动的方式
所遇到的摩擦力会更小
那么在这里我们如何将这种思路
具体的兑现为G的一次高效移动呢
没错
只需将G此前的首元素
直接挪至到最后作为末元素
而其余的绝大多数元素
都可以在原地保持不动
我们知道子序列G此前的首元素
是由mi加1所指示的
而此后新的末元素应该是由k加1
所指定的
当然这个末元素当前也就是x
因此我们可以将G的滚动后移
以及x归入到L中去
这样两步紧凑的实现为
这样一个交换语句
至此虽然我们只介绍了
这样两种情况的处理方法
但在算法整个过程中的
绝大多数时刻
我们凭借这两招就已足够了
我们唯一还需要交代的
是这个算法终止之前的最后一步
到了那样一个时刻
子序列U已经变成了空
而L和G已经占据了
除侯选轴点之外的所有范围
至此也就到了这个侯选轴点就位
并成为一个真正轴点的时刻了
那么这个侯选轴点
应该被安放到什么位置呢
没错
根据我们L小G大的不变性
这个侯选轴点应该被安置与L和G
之间的交接处
更准确的讲G将保持不动
而L的末元素则应该被替换为
这个侯选轴点
同样的为此我们只需
在这个末元素与侯选轴点之间
完成一次互换
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试