继续快速排序复杂度分析

上一篇博客我们给出了快速排序的两个结论。我们说如果随机选取pivot,则快速排序的平均复杂度为\mathcal{O}(n\log n),今天主要证明上一篇博客中的lemma 2。至于一个数组的中位数能够在线性事件复杂度内查找完成,我们留在之后来进一步讲解。

首先我们回忆一下快速排序的主要步骤:

1. 随机选择一个元素作为pivot;

2. 将原数组分为两部分,一部分都比pivot小, 另一部分都比pivot大;

3. 对两部分递归步骤1和步骤2;

从上面我们可以发现,快速排序的主要计算复杂度就是步骤2中,数与数的比较,其他的没有做什么其他的计算。所以,我们分析清楚快速排序做了多少次比较,那么也就分析清楚了快速排序的计算复杂度了。

lemma 1:快速排序中,数组中的任意两个数之间最多比较1次。

Proof:从快速排序的步骤中我们发现,数组中的数只与我们选定的pivot进行比较。所以我们假设数组中第i大的数z_{i}与第j大的数z_{j},不失一般性,我们假设i<j。这两个数只有在一种情况下会发生比较,即z_{i}z_{j}其中有一个被选定为pivot,其他任何情况这两个数都不可能发生比较。

lemma 2: z_{i}z_{j}发生比较的可能性为\frac{2}{j-i+1}

Proof:我们假设 z_{i}z_{j}之间的数组内容为\{ z_{i},z_{i+1},...,z{j-1},z_{j} \},如果我们选择的pivot小于z_{i},或者pivot大于z_{j},那么上述的内容都会被分到同一边,从而  z_{i}z_{j} 不会发生比较运算。如果z{i}<\rm{pivot} <z_{j},则  z_{i}z_{j}会被分在不同的两边,后续也不可能发生比较了。因此,lemma 1我们说过了,只有  z_{i}z_{j}之中的任意一个被选为pivot,这两者才能发生比较。由于是均匀随机选择的,所以   z_{i}z_{j}之中的任意一个被选为pivot的概率为\frac{2}{j-i+1}

这里为了方便,我们定义一个随机变量x_{ij}表示 z_{i}z_{j}比较的次数。上文已经讨论过了,x_{ij}要么取0,要么取1。而该随机变量的期望E(x_{i}) = Pr(x_{i}=0)*0+ Pr(x_{i}=1)*1=Pr\{z_{i} \ compares z_{j}\}。因此,我们的复杂度可以推导出来为T(n) = \sum_{i=1}^{n} \sum_{j=i+1}^{n}E(x_{i})

 根据lemma 2,那么我们可以得到复杂度上界T(n)=\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}\frac{2}{j-i+1}=2\sum_{i=1}^{n-1}(\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n-i+1})\leq 2n( \frac{1}{2}+\frac{1}{3}+...+\frac{1}{n})=2n\sum_{k=1}^{n}\frac{1}{k}

又由于\sum_{k=1}^{n}\frac{1}{K}\leq \int_{1}^{n}\frac{1}{x}dx=\ln n,因此总共的复杂度为\mathcal{O}(n\log n),证毕。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值