归并排序如何处理长度为 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"。如果一个数组有奇数个项目,那么拆分它会导致一个子数组比另一个子数组多一个项目。它不会使问题变得更困难:合并两个不同长度的数组没有问题。
我读了书,遇到了我无法解决的问题。我一直在查找信息。我在试图理解它时崩溃了。
因此,我得到了一个长度为 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"。如果一个数组有奇数个项目,那么拆分它会导致一个子数组比另一个子数组多一个项目。它不会使问题变得更困难:合并两个不同长度的数组没有问题。