algorithm - 归并排序的大o

标签 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) 而 merge 函数的大 o 是 n 并且函数 merge 调用了 7 次是 n - 1

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

那么合并的调用将是

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

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

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

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

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

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

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

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

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

但我想一步步计算

最佳答案

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

关于algorithm - 归并排序的大o,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53772001/

相关文章:

algorithm - 到达数组点的最少步数

java - 在有障碍物的二维矩阵中找到到达给定目标单元格的最短路径

algorithm - 广度优先搜索完全图的复杂度是多少?

c++ - 使用 vector 进行归并排序 (int) C++

c - 前N个素数优化

algorithm - 在简单的线性数据集中查找并修复错误值

algorithm - 层次和相同时的递归树

java - java priorityQueue poll()方法的大O是什么

c# - 合并排序中的重复步骤

java - 堆排序与合并排序的速度对比