有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

有人能解释这种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)和子产品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) 个答案

  1. # 1 楼答案

    “高”不是递增的。对于每个递归调用,high将减半。4, 2, 1, 0. 以这种方式调用,将列表拆分为尽可能小的部分,以便合并它们。 它将继续重复出现,直到(对于此代码段)low和high相同为止

  2. # 2 楼答案

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

    在调试器中,如果您观看带有参数(data, 0, 0)mergesort调用,您将看到它命中if,失败并返回(在返回之前显示局部变量将显示high=0{},当然,函数的局部变量)。一旦该函数返回,您将进入其父函数的堆栈框架,此时显示局部变量将显示low=0{}(父函数的局部变量的值)。它从来没有递增过,你只是在看一个不同的high