算法分析-快速排序

对于QuickSort,证明第一次分隔阶段(在指针交叉之前)用的平均交换次数是: N − 2 6 \frac{N-2}{6} 6N−2​

前提

  1. 待排序数组为 N N N 个顺序随机且元素互异的数组;
  2. 使用最后一个元素作为分隔元(partitioning element);
  3. 数组索引为到 1 1 1 到 N N N

假设

  • 分隔元是 N N N 个数中的第 j j j 个最大元素

证明

  1. 在除了分隔元剩余的 N − 1 N-1 N−1 个元素中,有 j − 1 j-1 j−1 个元素小于分隔元,有 N − j N-j N−j 个元素大于分隔元

  2. 这 N − 1 N-1 N−1 个元素每个元素大于分隔元的概率为 p = N − j N − 1 p=\frac{N-j}{N-1} p=N−1N−j​前 j − 1 j-1 j−1 个元素中大于分隔元的个数(即交换次数)的期望为: E = ( N − j ) ( j − 1 ) N − 1 E=\frac{(N-j)(j-1)}{N-1} E=N−1(N−j)(j−1)​

  3. 对于每个 1 ≤ j ≤ N 1\le j \le N 1≤j≤N ,其出现的概率是 1 N \frac1N N1​,即可解得平均交换次数为:
    T = 1 N ∑ 1 ≤ j ≤ N ( N − j ) ( j − 1 ) N − 1 T = N − 2 6 \begin{aligned} &T = \frac 1N \sum_{1\le j\le N}\frac{(N-j)(j-1)}{N-1} \\ \\ &T= \frac {N-2}{6} \end{aligned} ​T=N1​1≤j≤N∑​N−1(N−j)(j−1)​T=6N−2​​

Reference

  1. C. A. R. Hoare, Quicksort, The Computer Journal, Volume 5, Issue 1, 1962, Pages 10–16, \https://doi.org/10.1093/comjnl/5.1.10

上一篇:循环之美


下一篇:vue-element-admin里的plop-templates是做什么的