当前课程知识点:数据结构(下) > 第十二章 排序 > (a4)快速排序:变种 > 12a4-4: 实例
在告别本节之前
我们不妨通过一个具体的实例
来切实的体验
快速排序的这个新的版本
这里的输入序列由11个元素构成
这个算法会首先将首元素6
作为侯选轴点
而其余的元素则整体构成子序列U
当然相应的子序列L和G此时都是空
以下进入算法的迭代部分
首先在第一步迭代中
我们考虑的是U 当前的首元素3
这个元素要比侯选轴点更小
因此它应该被归入到子序列L中
在我们刚才实现的算法中
这就对应于if的分支
当然这是一种退化的情况
因为这个兑换
实际上就是它自己和自己
所以在位置上这个元素
并没有实质的改变
然而此后在逻辑上
子序列L将拥有第一个元素
而不再是空
接下来我们继续考察新的首元素8a
因为它在数值上要大于侯选轴点
所以对应于los那个分支
这是一个只需简明处理的分支
具体来说
我们在这种情况下
只需简明的利用k++
从而在使得子序列U
缩短一个单位的同时
使得子序列G拥有了第一个元素
再接下来我们会进而考虑
新的首元素1
可以看到它比侯选轴点要更小
因此应该被归入到子序列L当中
我们需要令它和子序列G的首元素
互换位置
当然此时G的首元素
也就是它那个唯一的元素8a
可以看到在经过了这样一次交换之后
二者的位置的确颠倒了过来
请注意在经过了这样一次交换之后
更主要的在逻辑上是等效于子序列L
向后拓展了一个单位
同时子序列G滚动式的后移了一个单位
接下来我们继续考察
子序列U的首元素也就是5a
可以看到
它依然应该被归入到子序列L当中
为此我们依然需要令它
和子序列G的首元素
也就是8a做一次交换
经过了这样的一次交换之后
不仅这两个元素的相对位置
颠倒过来了
而且更重要的是在逻辑上
子序列L又继续向后拓展了一个单位
同时子序列G也滚动式的
又后移了一个单位
接下来我们依然要考察子序列U
新的这个首元素9
作为大于侯选轴点的元素
它自然应该归入子序列G中
我们知道这对于算法中的los分支
因此只需简明的利用k++
就可以在逻辑上利用子序列G
向后拓展一个单位
在以下我们仍然是要
考察子序列U的首元素
这回轮到的是8b
因为它不小于侯选轴点
因此同样对应的是los那个分支
也就是说
我们依然只需简明的利用K++
就可以使得子序列G
继续向后拓展一个单位
接下来的这个首元素4
要小于侯选轴点
所以它对应的是if分支
于是我们需要令它
与子序列G的首元素8a互换位置
在经过了这样一次交换之后
子序列L向后继续拓展了一个单位
同时子序列G也滚动式的
后移了一个单位
再接下来的这个首元素5b
同样应该被归入于子序列L当中
因此我们仍然需要令它
与子序列G的首元素9互换位置
同理在经过了这样一次交换之后
子序列L得以向后继续拓展一个单位
同时子序列G再次滚动式的后移一个单位
现在轮到新的首元素7了
它要比侯选轴点更大
所以应该通过简明的K++
将它归入到子序列G中
同时子序列L保持不变
现在轮到子序列U的最后一个元素2了
它比侯选轴点更小
因此应该被归入到子序列L中
我们的处理手法依然
也就是要利用这个元素
与子序列G当前的首元素8b
做一次交换
在经过最后的这一次交换之后
L再次向后拓展了一个单位
而子序列G
再次滚动的后移一个单位
至此子序列U变成空
因此循环得以退出
在算法终止之前
我们还需要完成最后一步
也就是利用侯选轴点就位
并成为一个名副其实的轴点
你应该记得我们的做法是
令这个侯选轴点
与当前子序列L的末元素
也就是2互换位置
可以看到在如此交换之后
候选节点6的确成为了一个
名副其实的轴点
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试