分析归并排序的时间复杂度,并证明

归并排序(Merge sort)

归并排序采用了分而治之的思想,过程可概括为以下几步:

MergeSort(arr[],l,r) if r > l middle m = (l+r)/2 //Find the middle point to divide the array into two halves mergeSort(arr,l,m) //Call mergeSort for first half mergeSort(arr,m+1,r) //Call mergeSort for second half merge(arr,l,m,r) //Merge the two halves sorted in step 2 and 3

复杂度证明(展开法)

根据算法的第一步可知

T(N)=2T(N2)+O(N)T(N) =2 T(\frac{N}{2})+ O(N)

T(N)=2T(N/2)+O(N)=2(2T(N/4)+O(N2))+O(N)=4T(N/4)+O(N)+2O(N2)=4T(N/4)+2O(N)=8T(N/8)+3O(N)=2kT(N/2k)+kO(N)\begin{aligned} T(N) &=2 T(N / 2)+ O(N) \\ &=2\left(2 T(N / 4)+O(\frac{N}{2}) \right)+O(N) \\ &=4 T(N / 4)+ O(N)+2O(\frac{N}{2}) \\ &=4 T(N / 4)+2 O(N) \\ &=8 T(N / 8)+3 O(N) \\ & \vdots \\ &=2^{k} T\left(N / 2^{k}\right)+k O(N) \end{aligned}

N=2KN=2^{K} 时迭代停止,此时 K=log2NK=\log_{2}N

代入,得

T(N)=NT(1)+log2NO(N)=O(NlogN)T(N) = NT(1)+\log_2N\cdot{}O(N) = O(N\log{N})

PS1: 这里假设 N 为偶数,如果不是,那么假设 N 介于 2i2^i2i+12^{i+1} 之间,通过估计 T(2i+1)T(2^{i+1}) 来确定 T(N)T(N)上界

PS2: O(N)=aN=2O(N2)O(N) = aN=2O(\frac{N}{2}),因为大O复杂度只看上界,所以其常数项可以被忽略, 来自于把一个待排序序列分解成两个序列的时间,这一操作可以在常数项内完成(设定一个下标的时间)。

复杂度证明(假设法)

假设 T(N)=O(NlogN)aNlogN+bT(N)=O(NlogN)\leq aN\log{N}+ba,ba,b 为常数。

N=1N=1 时,T(1)=bT(1)=b,成立

N=k+1N=k+1 时,N2=k+12k\frac{N}{2}=\frac{k+1}{2}\leq kN2N\geq 2 时成立

T(N2)a(N2)logN2+bT(\frac{N}{2})\leq a(\frac{N}{2})\log{\frac{N}{2}}+b

因此,

T(N)2T(N2)+C2N//代入2a(N2logN2+b+C2N=aNlogNaNlog2+C2N+2b=aNlogNaN+C2N+2b\begin{aligned} T(N)&\leq 2\textcolor{red}{T(\frac{N}{2})} + C_2N \quad//代入\\ &\leq 2(a(\frac{N}{2}\log{\frac{N}{2}}+b)+C_2N \\ &=aN\log{N}-aN\log2+C_2N+2b\\ &=aNlogN-aN+C_2N+2b \end{aligned}

T(N)aNlogNaN+C2N+2bT(N) \leq aNlogN-aN+C_2N+2b

又因为假设 T(N)=O(NlogN)aNlogN+bT(N)=O(NlogN)\leq aN\log{N}+b,使假设成立,则

T(N)aNlogNaN+C2N+2baNlogN+bT(N) \leq \textcolor{red}{aNlogN-aN+C_2N+2b \leq aN\log{N}+b}

解红线的式子,得

aN+C2N+b0-aN+C_2N+b \leq 0

a=C1+C2,  b=C1a=C_1+C_2,\; b=C_1 时不等式成立。

得证