我有这个代码而且我正在尝试理解它的棘手行为,是的,整个程序工作我只是无法理解它的棘手行为:
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
是如何增加的?
答案 0 :(得分:0)
高不增加。每次递归调用时,高位减半。 4,2,1,0。 以这种方式调用它将列表拆分为最小可能部分以便合并它们。 它会继续重复,直到(对于这段代码)低和高是相同的。
答案 1 :(得分:0)
low
和high
是本地变量。这意味着它们仅对它们在(或传递给)中创建的函数可见。当针对mergesort
的特定来电退出时,其使用的high
low
和m
将被简单地丢弃(它们不会影响父级的low
,{{ 1}},或high
。
在调试器中,如果您通过参数m
观看对mergesort
的调用,您会看到它点击(data, 0, 0)
,失败并返回(在返回之前显示本地人将显示{{ 1}} if
当然是函数的局部变量)。一旦该函数返回,您将在其父级的堆栈框架中,并且在该点显示本地将显示high=0
low=0
(父级的局部变量的值)。它从未增加,你只是在看另一个low=0
。