任何人都可以解释这种Java Mergesort行为解释吗?

时间:2012-03-18 02:18:14

标签: java algorithm mergesort

我有这个代码而且我正在尝试理解它的棘手行为,是的,整个程序工作我只是无法理解它的棘手行为:

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)和子产品mlow + 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 = 0high = 0不正确,它退出if(没有其他)并返回调用函数执行另一批另一条指令的位置:

merge(data, low, high, m);

但是根据调试程序,它使用low = 0high = 1m = 0进行调用。为什么用这些参数调用它? high是如何增加的?

2 个答案:

答案 0 :(得分:0)

高不增加。每次递归调用时,高位减半。 4,2,1,0。 以这种方式调用它将列表拆分为最小可能部分以便合并它们。 它会继续重复,直到(对于这段代码)低和高是相同的。

答案 1 :(得分:0)

lowhigh本地变量。这意味着它们仅对它们在(或传递给)中创建的函数可见。当针对mergesort的特定来电退出时,其使用的high lowm将被简单地丢弃(它们不会影响父级的low,{{ 1}},或high

在调试器中,如果您通过参数m观看对mergesort的调用,您会看到它点击(data, 0, 0),失败并返回(在返回之前显示本地人将显示{{ 1}} if当然是函数的局部变量)。一旦该函数返回,您将在其父级的堆栈框架中,并且在该点显示本地将显示high=0 low=0(父级的局部变量的值)。它从未增加,你只是在看另一个low=0