【发布时间】:2019-06-27 17:17:36
【问题描述】:
所以我试图理解mergeSort算法的实现,但我无法理解进程在开始时是如何流动的,而它必须划分数组。下面是排序算法
void sort(int arr[], int l, int r)
{
if (l < r)
{
// Find the middle point
int m = (l+r)/2;
// Sort first and second halves
sort(arr, l, m); //talking about
sort(arr , m+1, r); //this part
// Merge the sorted halves
merge(arr, l, m, r);
}
我想到的唯一一个分支数组的模型是这个(考虑数组 {48, 34, 4, 1}):
m(a, l(0), r(3));
m(a, l(0), m(1));
m(a, l(0), m(0));
m(a, m+1(1), r(1));
m(a, m+1(2), r(3));
m(a, l(2), m(2));
m(a, m+1(3), r(3);
这是通话的顺序吗? 来电:
sort(arr, l, m);
sort(arr , m+1, r);
我也无法理解为什么当方法参数不满足 if 条件 (l<r) 时,算法会跳回到数组的另一边并对其进行排序。
【问题讨论】:
-
只有在除法过程产生两个运行一个元素时才会发生合并(这发生在 (l == r) 和 sort() 刚刚返回时),然后才开始合并过程。对于自上而下的归并排序,顺序是深度优先,左优先。自底向上合并排序通过将包含 n 个元素的数组视为大小为 1 的 n 次运行来跳过所有递归除法,并立即开始合并运行对。
标签: java sorting recursion mergesort