上一篇博客我们给出了快速排序的两个结论。我们说如果随机选取pivot,则快速排序的平均复杂度为,今天主要证明上一篇博客中的lemma 2。至于一个数组的中位数能够在线性事件复杂度内查找完成,我们留在之后来进一步讲解。
首先我们回忆一下快速排序的主要步骤:
1. 随机选择一个元素作为pivot;
2. 将原数组分为两部分,一部分都比pivot小, 另一部分都比pivot大;
3. 对两部分递归步骤1和步骤2;
从上面我们可以发现,快速排序的主要计算复杂度就是步骤2中,数与数的比较,其他的没有做什么其他的计算。所以,我们分析清楚快速排序做了多少次比较,那么也就分析清楚了快速排序的计算复杂度了。
lemma 1:快速排序中,数组中的任意两个数之间最多比较1次。
Proof:从快速排序的步骤中我们发现,数组中的数只与我们选定的pivot进行比较。所以我们假设数组中第i大的数与第j大的数
,不失一般性,我们假设
。这两个数只有在一种情况下会发生比较,即
或
其中有一个被选定为pivot,其他任何情况这两个数都不可能发生比较。
lemma 2: 与
发生比较的可能性为
。
Proof:我们假设 与
之间的数组内容为
,如果我们选择的pivot小于
,或者pivot大于
,那么上述的内容都会被分到同一边,从而
与
不会发生比较运算。如果
,则
与
会被分在不同的两边,后续也不可能发生比较了。因此,lemma 1我们说过了,只有
与
之中的任意一个被选为pivot,这两者才能发生比较。由于是均匀随机选择的,所以
与
之中的任意一个被选为pivot的概率为
。
这里为了方便,我们定义一个随机变量表示
与
比较的次数。上文已经讨论过了,
要么取0,要么取1。而该随机变量的期望
。因此,我们的复杂度可以推导出来为
。
根据lemma 2,那么我们可以得到复杂度上界
又由于,因此总共的复杂度为
,证毕。