我们如何才能得出这笔费用?

时间:2014-07-27 17:14:57

标签: sorting mergesort

我想找到以下合并排序算法的成本:

  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

但我还没有真正理解我们如何能够得出这种关系。

你能解释一下吗?

2 个答案:

答案 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