有人能解释这种Java合并排序行为解释吗?
我有这段代码,我试图理解它的棘手行为,是的,整个程序都在工作,我就是不理解它的棘手行为:
private static void mergesort(int data[], int low, int high)
{
int m; // Midpoint in the array
if (low < high)
{
// Compute sizes of the two halves
// Rounding to least significant value (next lower integer, implicit casting)
m = (low + high) / 2 ;
mergesort(data, low, m); // Sort data[first] through data[first+n1-1]
mergesort(data, m+1, high); // Sort data[first+n1] to the end Porque aumenta high sólo si los parametros iniciales son (data, 0, 0)
merge(data, low, high, m);
}
}
假设我有一个数据列表:{5, 3, 1, 2, 4}
如果我开始监视参数(data[], low, high)
和子产品m
(low + high /2
),我们会对mergesort
进行递归调用,特别是在If条件之后的这条指令:
mergesort(data, low, m);
我得到:
STEP 1 2 3 4
low 0 0 0 0
high 4 2 1 0
mid 2 1 0 0
正如你所看到的,到目前为止一切都很好(这对我来说是有意义的),但我们有条件:
if (low < high)
这对于low = 0
和high = 0
是不正确的,它退出if(没有其他项)并返回调用函数以执行另一批指令的位置:
merge(data, low, high, m);
但是根据调试器,它是用low = 0
、high = 1
、m = 0
调用的。为什么用这些参数来调用它?high
是如何递增的
# 1 楼答案
“高”不是递增的。对于每个递归调用,high将减半。4, 2, 1, 0. 以这种方式调用,将列表拆分为尽可能小的部分,以便合并它们。 它将继续重复出现,直到(对于此代码段)low和high相同为止
# 2 楼答案
low
和high
是局部变量。这意味着它们仅对在其中创建(或传递给)的函数可见。当对mergesort
的特定调用退出时,它使用的high
{m
将被简单地丢弃(它们不会影响父级的low
、high
或m
)在调试器中,如果您观看带有参数},当然,函数的局部变量)。一旦该函数返回,您将进入其父函数的堆栈框架,此时显示局部变量将显示}(父函数的局部变量的值)。它从来没有递增过,你只是在看一个不同的
(data, 0, 0)
的mergesort
调用,您将看到它命中if
,失败并返回(在返回之前显示局部变量将显示high=0
{low=0
{high