【问题标题】:Cannot understand the non-recursive MergeSort algorithm看不懂非递归的 MergeSort 算法
【发布时间】:2014-01-01 19:50:38
【问题描述】:

在最近对递归版本进行编码后,我一直在尝试理解非递归 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份然后排序,效率如何?如果您的数组包含数千个值会发生什么。 . .递归会不会更好,因为它将值分成更小的部分?

图书演示:

【问题讨论】:

标签: java algorithm merge mergesort


【解决方案1】:

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

但是,此实现不是合并排序。由于选择排序为 O(n^2),因此它的渐近效率将远比合并排序的 O(n log(n))。

但是可以在不使用递归的情况下进行合并排序 - 您可以使用迭代。参见实现here

【讨论】:

    【解决方案2】:

    我认为这个例子纯粹是用来演示合并排序的一个步骤。使用选择排序对两半进行排序,这种实现几乎没有归并排序的“味道”,而且肯定不会有归并排序的渐近复杂度保证。

    如果您已经编写了递归归并排序,我认为这个示例与您没有太大关系。实际的非递归归并排序看起来与此大不相同。

    【讨论】:

    • 我知道它会有所不同,但如何?
    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多