我想找到以下合并排序算法的成本:
Merge(A,p,q,r)
n1=q-p+1;
n2=r-q;
We create the sequences:
L[1 .... n1+1] and R[1.... n2+1]
for i<-1 to n1
L[i]<-A[p+i-1]
for j<-1 to n2
R[j]<-A[q+j]
L[n1+1]<-oo , R[n2+1]<-oo ( sentinel elements )
Composition:
i<-1, j<-1
for k<-p to r
if L[i]<=R[j] then
A[k]<-L[i]
i<-i+1
else
A[k]<-R[j]
j<-j+1
MERGESORT(A,p,r)
if p<r then
q<-floor((p+r)/2)
MERGESORT(A,p,q)
MERGESORT(A,q+1,r)
Merge(A,p,q,r)
根据我的教科书,费用为T(n)= 2T(n / 2)+ cn,n> 1且T(n)= c,n = 1
但我还没有真正理解我们如何能够得出这种关系。
你能解释一下吗?
答案 0 :(得分:2)
在每次递归中,您将 T(n)大小 n 的问题拆分为两个问题 T(n / 2) )大小 n / 2 ,所以你得到 2 * T(n / 2)。在最后一次递归之后,您必须将排序后的列表合并在一起。合并排序列表在 O(n)中完成,相当于 c * n 。
所以完整的费用是 T(n)= 2T(n / 2)+ cn 。
答案 1 :(得分:2)
T(n) = 2T(n/2) // two reucrsive calls, each on half the array
+ cn // the cost of merge. Merge runs in linear time.
我们可以将其写为
T(n) = O(nlogn)
由于
T(n) = 2T(n/2) + cn
= 4T(n/4) + cn + cn
= 8T(n/8) + cn + cn + cn
= ... (after log times)
= n*T(n/n) + cn + cn + cn + ... + cn (where cn appears log(n) times)
= c*logn*n