T(n)=2T(n/2)+n
设n=2^k
T(n/2)=2T(n/2^2)+n/2
T(n/2^2)=2T(n/2^3)+n/2^2
T(n)=2T(n/2)+n=2^2T(n/2^2)+2*n/2+n=2^3T(n/2^3)+2^2*n/2^2+2*n/2+n
=2^kT(1)+kn=nT(1)+kn=n(logn+T(1))=o(nlogn)
注:T(1)=0
快速排序的最优时间复杂度是 O(nlogn)O(nlogn),最差时间复杂度是 O(n2)O(n2),期望时间复杂度是 O(nlogn)O(nlogn)。
这里我们证明一下快排的期望时间复杂度。
设 T(n)T(n) 为对长度为 nn 的序列进行快速排序所需要的期望时间。我们有:
<script type="text/javascript" src="http://common.cnblogs.com/script/ASCIIMathML.js"></script>
T(0)=0T(0)=0
以及:
T(n)=n+1n∑i=0n−1(T(i)+T(n−i−1))T(n)=n+1n∑i=0n−1(T(i)+T(n−i−1))
我们可以通过放缩来获得对 T(n)T(n) 上界的一个估计。
T(n)=n+1n∑i=0n−1(T(i)+T(n−i−1))T(n)=n+1n∑i=0n−1(T(i)+T(n−i−1))
=n+2n∑i=2nn−1(T(i)+T(n−i−1))=n+2n∑i=2nn−1(T(i)+T(n−i−1))
=n+2n∑i=2n3n4(T(i)+T(n−i−1))+2n∑i=3n4n−1(T(i)+T(n−i−1))=n+2n∑i=2n3n4(T(i)+T(n−i−1))+2n∑i=3n4n−1(T(i)+T(n−i−1))
因为 T(n)>=nT(n)>=n , 所以对于 n2<=i<=jn2<=i<=j,我们显然有:
T(i)+T(n−i)<=T(j)+T(n−j)T(i)+T(n−i)<=T(j)+T(n−j)
所以:
T(n)<=n+2n∑i=2n3n4(T(3n4)+T(n4))+2n∑i=3n4n−1(T(n−1)+T(0))T(n)<=n+2n∑i=2n3n4(T(3n4)+T(n4))+2n∑i=3n4n−1(T(n−1)+T(0))
<=n+12(T(3n4)+T(n4))+12T(n−1)<=n+12(T(3n4)+T(n4))+12T(n−1)
我们要证明 T(n)=O(nlogn)T(n)=O(nlogn) , 这需要证明存在常数 cc 满足 T(n)<=cnlognT(n)<=cnlogn。
我们考虑用数学归纳法证明。n=0n=0时定理显然成立。现在假设对于 m<=nm<=n 定理皆成立。那么:
T(n)<=n+12(T(3n4)+T(n4))+12T(n−1)T(n)<=n+12(T(3n4)+T(n4))+12T(n−1)
<=n+12(c(3n4)log(3n4)+c(n4)log(n4))+12c(n−1)log(n−1)<=n+12(c(3n4)log(3n4)+c(n4)log(n4))+12c(n−1)log(n−1)
<=n+c(3n8log(n)−3n8log(43)+n8log(n)−n8log(4)+n2log(n))<=n+c(3n8log(n)−3n8log(43)+n8log(n)−n8log(4)+n2log(n))
=cnlogn+n(1−3c8log(43)−c4)=cnlogn+n(1−3c8log(43)−c4)
当 1−3c8log(43)−c4<=01−3c8log(43)−c4<=0 时,也即约 c>=52c>=52,我们有:
T(n)<=cnlognT(n)<=cnlogn
.
归纳成立,T(n)=O(nlogn)T(n)=O(nlogn).
来源:https://www.cnblogs.com/xfcao/p/12551686.html