递归自上而下的mergesort

时间:2017-01-27 13:16:13

标签: java algorithm mergesort

我试图让我的头围绕递归排序函数,这是mergesort算法的一部分。这是我的代码,我几乎可以肯定这是正确的(在线课程之后)。

    private static void sort(Comparable[] a, Comparable[] aux, int low, int high) {
         if (high <= low) return;
         int mid = low + (high - low) / 2;
         sort (a, aux, low, mid);
         sort (a, aux, mid+1, high);
         merge(a, aux, low, mid, high);
   }

我理解mergesort的作用 - 它将每个子数组分解为2个较小的子数组,重复此操作直到子数组的长度为1(并按定义排序),然后合并。但是,这种排序功能用于实现此目的的实际方法对我来说很难遵循。也许是因为我不习惯递归函数,但我想知道是否有人可以阐明操作的顺序以及第一次合并发生时参数是什么。

例如,当它遇到FIRST递归调用sort(a,aux,low,mid)时 - 它是否会中断操作而不进行第二次排序和下面的合并函数,而是立即再次使用new调用sort参数?在这种情况下,第二次调用时会进行排序; sort(a,aux,mid + 1,high);发生?

感谢您的帮助。这是我第一次发布此处,如果有任何格式问题,请告诉我。

2 个答案:

答案 0 :(得分:2)

  

当它遇到FIRST递归调用sort(a,aux,low,mid)时 - 它是否会中断操作而不进行第二次排序和下面的合并函数,而是立即再次使用新参数调用sort? / p>

  • 是。它再次为新参数调用该函数(递归),向下移动直到它对该部分进行排序。
  

在这种情况下,第二次调用是否会排序; sort(a,aux,mid + 1,high);发生?

  • 第一次调用完成后执行。 (当第一部分完成排序时)。

答案 1 :(得分:1)

如果您没有得到任何答案,请说明每一步:

 if (high <= low) return; // if your high and low numbers are the same then this part of the loop is finished and it will start going back up
 int mid = low + (high - low) / 2;//sets mid
 sort (a, aux, low, mid);//recursively calls itself so that it will eventually hit the first if. This handles from low to mid
 sort (a, aux, mid+1, high); //this handles from mid+1 to high
 merge(a, aux, low, mid, high); //This is where the merge starts. 

我觉得如果你真的很难过,可以运行一个简单的例子并通过笔和纸来完成它。