在最近对递归版本进行编码之后,我一直在努力理解非递归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然后排序这是如何有效的?如果您的数组包含数千个值,会发生什么。 。 。不会递归会更好,因为它将值分成较小的部分?
书籍演示:
答案 0 :(得分:1)
根据我的理解,本书的含义是你可以将数组分成两半,使用选择排序对每个数组进行排序,然后使用合并算法合并这两个部分(这与递归mergesort相同)。它可能只想表明合并是如何工作的。
但是,此实现 NOT 是一个mergesort。由于选择排序为O(n ^ 2),它的渐近效率远远低于mergesort的O(n log(n))。
但是可以在不使用递归的情况下进行mergesort - 您可以使用迭代。请参阅实施here。
答案 1 :(得分:0)
我认为这个例子纯粹用于演示mergesort的一个步骤。由于这两个部分按选择排序进行排序,因此该实现几乎没有mergesort的“风格”,并且肯定不会有mergesort的渐近复杂性保证。
如果你已经编写了一个递归mergesort,我不认为这个例子与你有很大关系。实际的非递归mergesort看起来与此截然不同。