我正在学习用Java实现一些更简单的算法,但我不知道为什么该语句起作用:
private void doMergeSort(int lowerIndex, int higherIndex) {
if (lowerIndex < higherIndex) {
int middle = lowerIndex + (higherIndex - lowerIndex) / 2;
doMergeSort(lowerIndex, middle);
doMergeSort(middle + 1, higherIndex);
mergeParts(lowerIndex, middle, higherIndex);
}
}
我已经进行了调试,但我不明白doMergeSort的第二个实例怎么可能被调用-doMergeSort(middle + 1,upperIndex); -当先前的doMergeSort的最终迭代将0、0馈入方法时。这是否会使if语句返回false,并且第二个doMergeSort调用不执行?
该代码可以运行,并且结果正确,但是怎么可能呢?
最佳答案
我认为您感到困惑的根源是听起来像您认为lowerIndex
,middle
和higherIndex
的变量在递归调用中被修改了。他们没有。每个递归调用都会获得这些字段的单独副本,因此对doMergeSort(middle + 1, higherIndex);
的第二次调用不使用更新的middle
和higherIndex
,它将使用将它们传递到doMergeSort(int lowerIndex, int higherIndex)
时使用的所有值
因此,如果要打印每次调用时的变量,它们将看起来像这样……
doMergeSort(0,9)
doMergeSort(0,4)
doMergeSort(0,2)
doMergeSort(0,1)
doMergeSort(0,0)
doMergeSort(1,1)
mergeParts(0,0,1)
doMergeSort(2,2)
mergeParts(0,1,2)
doMergeSort(3,4)
doMergeSort(3,3)
doMergeSort(4,4)
mergeParts(3,3,4)
mergeParts(0,2,4)
doMergeSort(5,9)
doMergeSort(5,7)
doMergeSort(5,6)
doMergeSort(5,5)
doMergeSort(6,6)
mergeParts(5,5,6)
doMergeSort(7,7)
mergeParts(5,6,7)
doMergeSort(8,9)
doMergeSort(8,8)
doMergeSort(9,9)
mergeParts(8,8,9)
mergeParts(5,7,9)
mergeParts(0,4,9)