当前课程知识点:数据结构(下) > 第十二章 排序 > (a2)快速排序:性能分析 > 12a2-3: 平均情况
非常幸运的是以上基本的
快速排序算法
在常规的随机意义下
平均性能的确可以达到最优的nlogn
以下我们不妨针对
最为常见的均匀独立分布
来做一精确的估算
也就是说我们在这里假设
所有的元素都是均匀的取自于
某一个数值范围
同时各元素在确定各自取值时
是互不依赖的
我们来考察任何一个这样的随机序列
调用partition算法
对它所进行的划分
将有几种可能呢 无非n种可能
具体是哪种情况
完全取决于最初所选定的
那个侯选轴点
更准确的讲
是这个侯选轴点
在最终有序序列中
所具有的秩
如果将侯选轴点的这个秩
记作k
那么partition算法所输出的
子序列L长度也应该是k
这个子序列所对应的那个子任务
所需的平均运行时间
也因此就可以表示为Tk
对称的partition算法
所输出的子序列G
长度应该为n减k减1
这个子序列所对应的那个子任务
从递归的角度来看
所需要的平均运行时间也因此
可以表示为T n减k再减1
这样的一对排序子任务
总共所需要的运行时间也自然就是
二者之和
进一步的
既然按照假设这里服从均匀独立分布
因此各种情况出现的概率应该均等
具体来说都是n分之1
因此所有这些情况所对应的
平均运行时间
也就是用这个概率对它们的总和
进行平均
以下的分析
焦点就会聚在这个求和号上
尽管这个求和涉及到
前后两个序列
但是略加观察之后
我们不难发现
这两个序列的求和
应该完全是相等的
你能看出原因来吗
没错
这两个序列的取值范围
都是从零到n减1
只不过前者是递增的
从零到n减1
而后者只不过是递减的
从n减1到0
因此我们只需保留其中的一项
同时作为补偿
将它的系数加倍
接下来我们将这个等式的两端
同时乘以n
于是就可以得到这样一个等式
如果将其中所有的n都替换为n减1
我们又可以进而得到下面这个等式
现在我们只需将这两个等式相减
就可以得到这样一个等式
除了系数这个等式主要都包含
一个Tn以及一个和两个T n减一
接下来我们只需对Tn和T n减1
合并同类项
就可以得到这样一个等式
对于这样一个等式
我们不妨令它的左右两端同时除以n
以及n加1
于是就可以得到这样一个等式
如果我们将这个等式的左侧
表示和理解为另一个函数Sn
那么右侧的这一项
也就对应于Sn减1
这样我们也就得到了一个
关于Sn的简明递推式
因此接下来我们可以进而将右侧的
Sn减1替换为Sn减2
当然为此我们需要追加一项
这种递推可以持续进行下去
也就是说我们可以将Sn减2
替换为Sn减3
再将Sn减3替换为Sn减4
以及Sn减4替换成Sn减5诸如此类
在递推到最终一步之前
我们所引入的各项
将构成一个级数
你应该看得出来这是一个什么级数
没错 调和级数
我们在第一章就曾介绍过
就渐进意义而言
调和级数是与自然对数logN同接的
由此可见我们这里所需要的估计的
快速排序算法的平均运营时间
在渐进意义下的确不超过nlogn
那么它对应的常系数呢
为此我们只需将logn替换为
以2为底的对数
相应的也自然可以得知
常系数应为两倍的ln2
具体来说也就大致为1.39
这样小的一个常系数也保证了
快速排序算法在通常情况下的
优异性能
也就是说快速排序的确名副其实
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试