我刚刚读完了自下而上合并排序的要点,在我看来,这是有道理的,但是当我想到如何进行实施时,它让我有点困惑。
我知道我们从组合相邻的元素对开始,但是如何在合并它们之前比较元素的大小?这最终不会成为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。
答案 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;
}
}
}