java - 看不懂非递归MergeSort算法

标签 java algorithm merge mergesort

在最近对递归版本进行编码之后,我一直在尝试理解非递归 MergeSort 算法。我的 AP 书没有提供太多关于这个主题的信息或示例,所以我希望有人能帮我澄清一下。

我的书中的以下内容是什么意思:“在非递归 mergeSort 方法中。我们将列表分成两个大小相等的部分,并使用选择排序对每个部分进行排序,然后使用将在 中讨论的算法合并这两个部分B 部分。”

是否总是在非递归 mergeSort 方法中将数组分成两部分(然后相应地对它们进行排序),或者是否存在像递归版本这样的情况,在这种情况下,您会一直划分直到 array.length 为 2 或 1 ?

图书代码:

void mergeSort (ArrayList <Integer> A, int first, int last){
   int mid;

   mid = (first + last) / 2;
   selectionSort (A, first, mid);
   selectionSort (A, mid+1, last);
   merge (A, first, mid, last);
 }

如果总是把数组分成2份,然后排序,效率如何?如果您的数组包含数千个值,会发生什么情况。 . .递归不是更好吗,因为它将值分成更小的部分?

图书示范:

enter image description here

最佳答案

根据我的理解,这本书的意思是您可以将数组分成两半,使用选择排序对每个数组进行排序,然后使用合并算法合并这两半(这与递归归并排序相同)。它可能只想显示合并的工作原理。

但是这个实现不是归并排序。它的渐近效率将远比归并排序的 O(n log(n)) 因为选择排序是 O(n^2)。

但是可以在不使用递归的情况下进行归并排序——您可以使用迭代。查看实现 here .

关于java - 看不懂非递归MergeSort算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20872543/

相关文章:

java - json文件的maven资源过滤

java - 如何修改JSON数据并返回更新后的JSON数据

java - 不确定为什么 Java mergesort 算法偶尔会失败

java - Apache NiFi 无法启动流 Controller ,因为 TLS 配置无效 : The keystore properties are not valid

java - 启动 Java 项目 - IDE、Framework 等 -

arrays - 魔法阵索引时间/空间复杂度

python - 从给定的数字中找到一个总和为给定值的序列?

git - 为什么 git rebase 需要三向 merge ?

unix - 在终端中,将多个文件夹合并为一个

python - Pandas 通过数据框的 2 列将一个系列映射到另一个系列