归并排序如何处理长度为 N 的数组?

How merge sort works at arrays of length N?

我读了书,遇到了我无法解决的问题。我一直在查找信息。我在试图理解它时崩溃了。

因此,我得到了一个长度为 N (int) 的数组,使用非递归归并排序算法对其进行排序。我学习了长度为 2^n 的数组的归并排序算法。但我完全无法理解它如何处理长度为 N 的数组。

谁能给我解释一下它是如何工作的?

非递归合并排序将 N 个元素的数组视为大小为 1 的 N 个已排序 运行,然后将偶数和奇数 运行 从一个数组合并到另一个数组。如果有奇数个 运行s,最后一个被复制(没有合并),这可以在 merge() 函数中处理。完成合并过程后,运行 大小加倍为 2,并重复合并过程。当 运行 大小翻倍且 >= 数组大小时,归并排序完成。

代码维护了 3 个索引:左边开始 运行,右边开始 运行(== 左边结束 运行),右边结束 运行.在设置或推进索引时,如果索引变为 >= 数组大小,则它会减小到数组的大小。如果这发生在左侧 运行,那么这是最后一个奇数 运行,因此它被复制(同样,这可以在 merge() 函数中处理)。

维基百科有伪代码:

https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation

给定七个元素,子任务树如下所示:

          [3,5,2,1,4,7,6]
             /         \
      [3,5,2,1]        [4,7,6]
      /       \        /      \
   [3,5]    [2,1]    [4,7]    [6]
   /   \    /   \    /   \    /
 [3]  [5]  [2]  [1] [4]  [7] [6]

这个想法是在每个级别拆分数组 "in half"。如果一个数组有奇数个项目,那么拆分它会导致一个子数组比另一个子数组多一个项目。它不会使问题变得更困难:合并两个不同长度的数组没有问题。