合并排序的大对象

时间:2018-12-14 00:34:42

标签: algorithm big-o mergesort

void mergeSort(int arr[], int l, int r) 
{ 
   if (l < r) 
    { 
        // Same as (l+r)/2, but avoids overflow for 
        // large l and h 
        int m = l+(r-l)/2; 

        // Sort first and second halves 
        mergeSort(arr, l, m); 
        mergeSort(arr, m+1, r); 

        merge(arr, l, m, r); 
    } 
} 

这是合并排序的代码

我不明白它的大o是n log(n),而合并函数的大o是n,函数合并称为7次,即n-1

如果我们将以下数组作为输入{8,7,6,5,4,3,2,1}

那么合并的调用将是

merge({8,7,6,5,4,3,2,1},0,0,1)

merge({7,8,6,5,4,3,2,1},2,2,3)

merge({7,8,5,6,4,3,2,1},0,1,3)

merge({5,6,7,8,4,3,2,1},4,4,5)

merge({5,6,7,8,3,4,2,1},6,6,7)

merge({5,6,7,8,3,4,1,2},4,5,7)

merge({5,6,7,8,1,2,3,4},0,3,7)

那么结果将是{1,2,3,4,5,6,7,8}

所以要计算多少,我看到了主方法,知道了它的公式,并看到了3个级别的合并排序算法

但是我想一步一步地计算

2 个答案:

答案 0 :(得分:3)

使用Mergesort对长度为n的数组进行排序的时间复杂度为T(n)=2 * T(n/2) + O(n),其中T是时间复杂度函数,2 * T(n/2)是递归调用,O(n)正在合并这两个递归。现在,您可以根据需要通过T(n) ∈ O(n * log(n))上的归纳证明来证明m = log2(n)。这里说明了这样一种证明:https://www.cs.auckland.ac.nz/compsci220s1c/lectures/2016S1C/CS220-Lecture09.pdf

答案 1 :(得分:1)

一种简单的查看O(nlogn)的方法是使用递归树,因为T(n) = O(n) + 2T(n/2) 您可以像这样为T(n)绘制递归树:

             n
          /     \
     (n/2)       (n/2)
     /   \       /   \
 (n/4)  (n/4) (n/4) (n/4)
            .
            .
            .

在树的每一行中,总和为n(n = n,n / 2 + n / 2 = n,n / 4 + n / 4 + n / 4 + n / 4 = n,...)

您有log(n)行(因为每行n除以2),所以树中节点的总和为:O(nlogn)