算法分析与设计
二分归并排序
问题描述:
对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。
算法思路:
每次用分治的思想将数组进行二分操作,然后从下往上开始进行合并排序。
核心代码:
if p<r
then q<-(p+r)/2
mergesort(a,p,q)
mergesort(a,q+1,r)
merge(a,p,q,r)
时间复杂度:
设n=2k
W(n)=2W(n/2)+n-1=2[2W(n/4)+n/2-1]+n-1=22W(n/4)+2n-1-2
=22[2W(n/8)+n/4-1]+2n-1-2=23W(n/8)+3n-1-2-4=…
=2kW(1)+kn-(1+2+4+…+2k-1)=2kW(1)+kn-(2k-1)
=2kW(1)+kn-2k-1
把W(1)=0和k=logn代入上式得W(n)=nlogn-n+1=O(nlogn)
所以归并排序算法得时间复杂度为O(nlogn)。
源码:
https://github.com/SpiritDemon-max/myText/blob/master/mergeSort.cpp