底部向上合并排序的意外困境

时间:2014-11-08 21:05:37

标签: c

我刚刚读完了自下而上合并排序的要点,在我看来,这是有道理的,但是当我想到如何进行实施时,它让我有点困惑。

我知道我们从组合相邻的元素对开始,但是如何在合并它们之前比较元素的大小?这最终不会成为n ^ 2算法吗?

例如:

假设我有一个这样的阵列:

int a[6] = {1,3,2,6,8,7};

然后我把它分成1号(不是真的分裂,但看着我想的索引)

{1}{3}{2}{6}**{8}{7}**

之后就变成了这个:

{1,3}{2,6}**{7,8}**<<<<<<<< I am assuming we are using an if statement to arrange
switching 7 and 8 in the merge process only takes O(n)

然而,

我如何在下一次传球中进行比较:

**{1,2,3,6}**{7,8}   >>>> Wouldn't I need a nested for loop to compare and sort?

在我阅读的所有exmaples中,他们没有解释他们如何设法比较它,他们所说的只是将它合并并显示2个子阵列的图片,神奇地将它自己排序。我正在使用C进行此操作,我需要一些指导,以便在合并它时如何按顺序获取它。我想不出任何其他排序方式,但在合并后使用O(n ^ 2)嵌套for循环。如果有人能告诉我如何做到这一点,那么我将永远幸福!

我想要的是,如果我使用n ^ 2算法排序,它将不会是OlogN。

1 个答案:

答案 0 :(得分:0)

这里是从Wikipedia's Merge Sort Implementation开始的自下而上合并:

BottomUpMerge(int A[], int iLeft, int iRight, int iEnd, int B[])
{
    int i0 = iLeft;
    int i1 = iRight;
    int j;

    /* While there are elements in the left or right lists */
    for (j = iLeft; j < iEnd; j++) {
        /* If left list head exists and is <= existing right list head */
        if (i0 < iRight && (i1 >= iEnd || A[i0] <= A[i1]))
        {
            B[j] = A[i0];
            i0 = i0 + 1;
        }
        else
        {
            B[j] = A[i1];
            i1 = i1 + 1;
        }
    }
}