我试图让我的头围绕递归排序函数,这是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);发生?
感谢您的帮助。这是我第一次发布此处,如果有任何格式问题,请告诉我。
答案 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.
我觉得如果你真的很难过,可以运行一个简单的例子并通过笔和纸来完成它。