【问题标题】:Time Complexity of a Top Down Merge Sort?自上而下合并排序的时间复杂度?
【发布时间】:2015-04-30 02:51:47
【问题描述】:

我知道归并排序的时间复杂度是 O(nLogn),但是对于它的 Top Down 变体,我无法得出这个结论。

TopDownMerge(A[], iBegin, iMiddle, iEnd, B[])
{
i0 = iBegin, i1 = iMiddle;

// While there are elements in the left or right runs
for (j = iBegin; j < iEnd; j++) {
    // If left run head exists and is <= existing right run head.
    if (i0 < iMiddle && (i1 >= iEnd || A[i0] <= A[i1]))
        B[j] = A[i0];
        i0 = i0 + 1;
    else
        B[j] = A[i1];
        i1 = i1 + 1;    
    } 
}

我从 Wikipedia 页面得到了这个,“if”语句让我感到厌烦,而是它的条件让我发疯。任何帮助表示赞赏。

【问题讨论】:

  • 抱歉是哪种语言?有什么问题?
  • C++,不知道if语句运行了多少次

标签: sorting time merge complexity-theory


【解决方案1】:

您屏蔽的代码只是算法的部分:执行合并的部分。这部分的复杂度是 O(n)。 (logn 来自算法的另一半,数组被反复切分成段。)

首先,让我们定义一下(有点神秘的)变量的含义:

  • iBeginiMiddleiEnd表示A的工作段。左半部分(从iBeginiMiddle)和右半部分(从iMiddleiEnd)都已排序并准备好合并在一起。
  • i0A 工作段 半部分中“下一个”变量的索引。
  • i1A 工作段半部分中“下一个”变量的索引。
  • j 是工作数组 B 中下一个空点的索引。

每次循环时,都会从A 中复制一个元素,并将其放入数组B 的位置jif 语句负责确定该元素应该取自数组的左半边还是右半边。

if 语句执行(最多)三个检查:

  • 如果i0 &lt; iMiddle,则数组左半部分仍有要处理的元素。如果这是错误的,请转到 else 块并从数组的右半部分获取元素。
  • 如果是i1 &gt;= iEnd,则在数组的右半部分没有要处理的元素。如果是这样,请输入 if 块并从数组的左半部分获取元素。
  • 此时,数组的左右两半都必须有一些元素。比较两个元素:如果A[i0] &lt;= A[i1],则从左半边取下一个元素;否则,从右边拿走。

循环结束后,if 语句将始终执行j 次 - 对于我们从原始数组段复制到工作数组的每个元素执行一次。因此,将两个数组段合并在一起的工作量与数组的大小成正比,即 O(n)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多