【问题标题】:Merge sort process合并排序过程
【发布时间】: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&lt;r) 时,算法会跳回到数组的另一边并对其进行排序。

【问题讨论】:

  • 只有在除法过程产生两个运行一个元素时才会发生合并(这发生在 (l == r) 和 sort() 刚刚返回时),然后才开始合并过程。对于自上而下的归并排序,顺序是深度优先,左优先。自底向上合并排序通过将包含 n 个元素的数组视为大小为 1 的 n 次运行来跳过所有递归除法,并立即开始合并运行对。

标签: java sorting recursion mergesort


【解决方案1】:

在递归的某个时刻,sort(...) 不做任何事情,只是返回(因为 l == r)并且 2 个 sort(...) 方法都完成了。之后,合并开始起作用,它只是将 2 个元素按正确的顺序排列。发生这种情况后,上一次调用中的其他一些 sort(...) 方法完成,依此类推。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2013-03-15
    • 2018-08-27
    • 2016-02-05
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多