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个级别的合并排序算法
但是我想一步一步地计算
答案 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)