快速排序代码如下:
void quickSort(int a*, int p, int r)
{
if(p < r)
{
int q = partition(a, p, r); //划分
quickSort(a, p, q-1);
quickSort(a, q+1, r);
}
}
每一趟的工作量 = 子问题的工作量 + 划分的工作量(即划分的比较次数)
下图展示了n种可能的输入:

每一次划分的比较次数为 n-1,则工作量总和有:

上述工作量总和可简写为
2
∑
i
=
1
n
−
1
T
(
i
)
+
n
(
n
−
1
)
2\sum\limits_{i=1}^{n-1}T(i)+n(n-1)
2i=1∑n−1T(i)+n(n−1)
假设首元素排好序在每个位置是等概率的,则有:
T ( n ) = 2 n ∑ i = 1 n − 1 T ( i ) + O ( n ) , n > 1 T ( 1 ) = 0 \begin{aligned} &T(n) = \frac{2}{n}\sum\limits_{i=1}^{n-1}T(i)+O(n), n>1\\ &T(1)=0\\ \end{aligned} T(n)=n2i=1∑n−1T(i)+O(n),n>1T(1)=0
下面利用差消法化简上述递推方程,即
T
(
n
)
=
2
n
∑
i
=
1
n
−
1
T
(
i
)
+
c
n
T(n) = \frac{2}{n}\sum\limits_{i=1}^{n-1}T(i)+cn
T(n)=n2i=1∑n−1T(i)+cn
首先,两边同时乘n,有
(1)
n
T
(
n
)
=
2
∑
i
=
1
n
−
1
T
(
i
)
+
c
n
2
nT(n) = 2\sum\limits_{i=1}^{n-1}T(i)+cn^2 \tag1
nT(n)=2i=1∑n−1T(i)+cn2(1)
将
n
−
1
n-1
n−1带入,得:
(2)
(
n
−
1
)
T
(
n
−
1
)
=
2
∑
i
=
1
n
−
2
T
(
i
)
+
c
(
n
−
1
)
2
(n-1)T(n-1) = 2\sum\limits_{i=1}^{n-2}T(i)+c(n-1)^2 \tag2
(n−1)T(n−1)=2i=1∑n−2T(i)+c(n−1)2(2)
为了灭掉
T
(
i
)
T(i)
T(i),
(
1
)
−
(
2
)
(1)-(2)
(1)−(2)得:
n
T
(
n
)
−
(
n
−
1
)
T
(
n
−
1
)
=
2
T
(
n
−
1
)
+
c
1
n
nT(n)-(n-1)T(n-1)=2T(n-1)+c_1n
nT(n)−(n−1)T(n−1)=2T(n−1)+c1n
也就是:
(3)
n
T
(
n
)
=
(
n
+
1
)
T
(
n
−
1
)
+
c
1
n
nT(n)=(n+1)T(n-1)+c_1n \tag3
nT(n)=(n+1)T(n−1)+c1n(3)
对
(
3
)
(3)
(3)两边同时除以
n
(
n
+
1
)
n(n+1)
n(n+1)得
(4)
T
(
n
)
n
+
1
=
T
(
n
−
1
)
n
+
c
1
n
+
1
\frac{T(n)}{n+1}=\frac{T(n-1)}{n}+\frac{c_1}{n+1} \tag4
n+1T(n)=nT(n−1)+n+1c1(4)
对
(
4
)
(4)
(4)向下写出所有等式:
T
(
n
−
1
)
n
=
T
(
n
−
2
)
n
−
1
+
c
1
n
T
(
n
−
2
)
n
−
1
=
T
(
n
−
3
)
n
−
2
+
c
1
n
−
1
.
.
.
T
(
2
)
3
=
T
(
1
)
2
+
c
1
3
\begin{aligned} &\frac{T(n-1)}{n}=\frac{T(n-2)}{n-1}+\frac{c_1}{n} \\ &\frac{T(n-2)}{n-1}=\frac{T(n-3)}{n-2}+\frac{c_1}{n-1} \\ &...\\ &\frac{T(2)}{3}=\frac{T(1)}{2}+\frac{c_1}{3} \\ \end{aligned}
nT(n−1)=n−1T(n−2)+nc1n−1T(n−2)=n−2T(n−3)+n−1c1...3T(2)=2T(1)+3c1
迭代求解,将这些等式带回去
(
4
)
(4)
(4)得:
T
(
n
)
n
+
1
=
c
1
n
+
1
+
c
1
n
+
c
1
n
−
1
+
.
.
.
+
c
1
3
+
T
(
1
)
2
=
c
1
(
1
n
+
1
+
1
n
+
1
n
−
1
+
.
.
.
+
1
3
)
\begin{aligned} \frac{T(n)}{n+1}&=\frac{c_1}{n+1}+\frac{c_1}{n}+\frac{c_1}{n-1}+...+\frac{c_1}{3}+\frac{T(1)}{2}\\ &=c_1(\frac{1}{n+1}+\frac{1}{n}+\frac{1}{n-1}+...+\frac{1}{3}) \end{aligned}
n+1T(n)=n+1c1+nc1+n−1c1+...+3c1+2T(1)=c1(n+11+n1+n−11+...+31)
因为,
1
+
1
2
+
1
+
+
.
.
.
+
1
n
=
ln
(
n
)
+
C
,
其
中
C
为
欧
拉
常
数
1+\frac{1}{2}+\frac{1}{+}+...+\frac{1}{n}=\ln(n) +C, 其中C为欧拉常数
1+21++1+...+n1=ln(n)+C,其中C为欧拉常数
所以,
T
(
n
)
n
+
1
=
Θ
(
log
n
)
\frac{T(n)}{n+1} = \Theta(\log n)
n+1T(n)=Θ(logn)
综上,
T
(
n
)
=
Θ
(
n
log
n
)
T(n) = \Theta(n\log n)
T(n)=Θ(nlogn)