当前课程知识点:数据结构(下) > 第十二章 排序 > (a2)快速排序:性能分析 > 12a2-2: 最好情况 + 最坏情况
那么整个算法的运行时间呢
我们知道对于归并排序而言
整个算法的运行时间
可以保证不超过nlogn
我们也知道其关键在于
归并排序可以保证
任何一对被划分出来的子任务
在规模上都是彼此相当的
也就是规模都接近二分之N
因此总体的运行时间
也就是求解两个这样的问题
再加上为了将它们的结果合并
所需要的线性时间
很遗憾快速排序算法
却不能像归并排序算法那样
保证子任务划分时的均衡性
实际上partition算法的
每次划分结果
与其说是取决于这个算法
不如说取决于最初选定的侯选轴点
如果侯选轴点在最终有序序列中
所对应的秩为r
那么经划分之后所得到的序列L的长度
也必然就是r
而对应的子序列G
长度也必然为n减1再减r
划分的结果是否均衡
完全取决于我们的运气
当然在最好的情况下
我们的每次划分都是均衡的
或者至少是接近均衡的
于是我们自然可以达到
最优的nlogn
然而反过来在最坏的情况下
有可能我们的每一次划分
都不均衡
甚至极不均衡
比如最为极端的一种情况就是
每一个侯选节点
都是在当前而言
最小或者最大的极值元素
以至于在划分之后
子序列L为空
或者G为空
也就是说
在我们所划分出来的
一对子任务中
总是有一个规模为零
而另一个相对于此前的规模
只减少了一个单位
根据这个递推式不难解出
此时算法所需要的总体运行时间
必然是平方量级的
也就是说与起泡排序等低级算法
居然性能是相当的
当然采用一些简明的策略
在付出足够小的代价之后
我们的确可以在一定程度上降低
最坏情况出现的概率
比如我们可以采用所谓随机选取法
也就是说不再是每次都固定的将首元素
作为侯选轴点
而是在整个序列中
随机的选择其一
另一种更为有效的分法
是三者取中法
也就是说我们每次都是在整个序列中
随机的抽取三个元素
然后将其中数值居中的那个
作为侯选轴点
当然无论采用什么方法
我们也只能是在一定程度上
降低最坏情况出现的概率
而无法根本的杜绝最坏情况的出现
既然如此我们接下来
不得不回答的一个问题就是
就基本的快速排序算法而言
其平均性能又有多高呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试