快速排序:另一种分析

在给出快速排序另一种分析之前,先记一下Lecture 4中用到的那个不等式证明的大致框架:


 

关键点有两个,一是函数xlgx (x>=1)是个凸函数(convex function)。另一点就是将和式分成两部分,一部分k=2,3,...,ceiling(n/2) - 1,另一部分k=ceiling(n/2),ceiling(n/2)+1,...,n-1。xlgx是凸的可以验证一下它的二阶导数:(xlgx)" = 1/xln2 > 0。由这个凸性可以将每一个klgk约束在对应部分的两个端点所连的直线下面。如果画出函数xlgx的图像这一点会很清楚。剩下的就是计算,会用到整函数ceiling(x)的一些基本性质:n < ceiling(n) <= n + 1。

 

QUICKSORT的运行时间由PARTITION的时间决定。每次选定一个主元后,这个元素就不会再在后续的递归调用中出现了,因此在所有递归调用中最多只能有n次PARTITION调用。一次PARTITION调用会花费O(1)的时间和一部分与PARTITION中for循环次数成比例的时间。for中的每一次迭代都会产生一次比较(comparison)。如果我们能对这个比较做一个计数的话,就能确定QUICKSORT执行for循环的总时间了。

 

假定X表示QUICKSORT对n个元素排序的整个执行过程中PARTITION中的比较的总次数,则QUICKSORT的运行时间为O(n+X)。

 

因此我们的目标就是计算总比较次数X。将A中的元素重新标记为z_1, z_2, ... , z_n,z_i是A中第i小的元素,并且定义集合Zij = {z_i, z_{i+1}, ... , z_j},也就是在i,j之间(包括i,j)的元素。

 

每一对元素至多比较一次,这是因为每个元素只和主元比较一次,随后主元就不会再出现了,因些也就不可能再有元素和主元比较了。

 

我们需要计算z_i和z_j比较的概率。定义0-1随机变量Xij=I{z_i和z_j比较}。因为每对元素只比较一次,因此总次数可以用这个随机变量来表示:



 

两边取期望就可以得到:

 
 

 

剩下的就是计算出Pr{z_i和z_j比较},即z_i和z_j比较的概率。在一次PARTITION调用中,一旦某个主元x,z_i < x < z_j被选中后,z_i和z_j也就不可能被比较了。另一方面,如果z_i在Zij中任何别的元素被选中之前被选中,那么z_i会和Zij中的每一个进行比较(除z_i本身),同样,如果z_j是Zij中第一个被选中的,那么z_j会和Zij中每一个比较(除了z_j自己)。这说明z_i和z_j比较当且仅当z_i或者z_j第一个被选中时才会发生。Zij中的元素被选中的概率都是相等的。|Zij| = j - i + 1。因此Pr{z_i与z_j比较}=2/(j-i+1)。

 

现在可以计算E[X]了:


 

而最好时间为Omega(nlgn),所以随机快速排序的平均运行时间是Theta(nlgn)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值