有人能解释这种Java合并排序行为解释吗?

有人能解释这种Java合并排序行为解释吗?,java,algorithm,mergesort,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 sig

我有这段代码,我试图理解它的棘手行为,是的,整个程序都在工作,我就是不理解它的棘手行为:

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);
    }       
}
我得到:

STEP  1 2 3 4
low   0 0 0 0
high  4 2 1 0
mid   2 1 0 0
正如你所看到的,到目前为止一切都很好(这对我来说是有意义的),但我们有条件:

mergesort(data, low, m); 
 if (low < high)

但是根据调试器,它是用
low=0
high=1
m=0
调用的。为什么用这些参数来调用它?
high
是如何递增的?

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

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

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


在调试器中,如果您观看带有参数
(数据,0,0)
mergesort
调用,您将看到它命中
if
、fail和return(在返回之前显示局部变量将显示
high=0
low=0
,当然,函数的局部变量)。一旦该函数返回,您将进入其父函数的堆栈帧,此时显示局部变量将显示
low=0
high=1
(父函数的局部变量值)。它从未递增,您只是看到一个不同的

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

在调试器中,如果您观看带有参数
(数据,0,0)
mergesort
调用,您将看到它命中
if
、fail和return(在返回之前显示局部变量将显示
high=0
low=0
,当然,函数的局部变量)。一旦该函数返回,您将进入其父函数的堆栈帧,此时显示局部变量将显示
low=0
high=1
(父函数的局部变量的值)。它从未递增,您只是看到不同的
high

merge(data, low, high, m);