当前课程知识点:数据结构(下) > 第十二章 排序 > (a1)快速排序:算法A > 12a1-2: 轴点
为了实现霍尔爵士所设想的划分
我们需要借助轴点
所谓的轴点pivot
是在序列中的某一类特殊元素
这类元素的特征是
凡是居于它左侧的元素都不比它更大
对称的居于它右侧的元素也不比它更小
因此如果我们用高度
来表示元素的数值大小
那么相对于轴点所对应的这条水平线
左侧的元素都位于下方
而右侧的元素都位于上方
不难看出以任何一个轴点为界
整个序列总是可以分为左小右大的
两个子序列
而这正是霍尔爵士所设想的那种
左小右大式的划分
因此只要我们能够
在任何一个序列中
快速的找到其中的轴点
那么借助二分式的递归
我们就自然可以导出快速排序的
完整算法
由此我们也再一次更为清晰的看到
快速排序算法的核心
就在于如何快速的确定轴点
因此我们接下来需要实质讨论的重点
也无非就是这样一个
快速划分的算法
然而在通往快速划分算法
partition的道路上
我们首先就会遇到一个拦路虎
因为我们不能保证
在任何一个待排序的序列中
轴点元素总是存在的
实际上既然相对于轴点
所有的元素都是按照
前小后大的次序排列的
所以轴点自身必然是已经就位了
它在当前序列中所对应的秩
也就是它最终在有序序列中
所对应的秩
是的 轴点必然是就位的
这是一项非常强的必要条件
实际上每一个元素都有可能天生
不具备这个条件
任何元素都非就位的序列
普遍存在
实际上他们也就是所谓的乱排序列
derangement
比如任何一个有序序列只要经过一次
循环移位
就可得到一个这样的乱排序列
不难理解在完全有序的序列中
所有的元素自身都是一个轴点
而反过来如果一个序列中的所有元素
都是轴点那么它也自然是有序的
从这个角度来看
所谓的快速排序无非就是将
原序列中的所有元素
逐个的转换为轴点的过程
尽管在任意序列中
轴点未必天然的存在
但好消息是
只要适当的交换元素的位置
我们总是可以将任何一个元素
转化为一个轴点
那么具体的又当如何交换呢
为此我们又需要付出多高的成本呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试