java中的二进制搜索代码使用以下代码:
public static int binarySearch(int[] a, int fromIndex, int toIndex,
int key) {
rangeCheck(a.length, fromIndex, toIndex);
return binarySearch0(a, fromIndex, toIndex, key);
}
// Like public version, but without range checks.
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
为什么需要将fromIndex
复制到low
和toIndex
到high
?
保持参数值不被修改是一种好的做法吗?
可能有以下修改:
binarySearch0(a, fromIndex, toIndex - 1, key);
}
// Like public version, but without range checks.
private static int binarySearch0(int[] a, int low, int high,
while (low <= high) {
基本上我试图了解它是否有某种意图或有一些好的做法。
答案 0 :(得分:1)
保持参数不被修改是一个好习惯,最好将它们声明为final。 这也提高了方法的可读性。
答案 1 :(得分:1)
根据我的经验,特别是在参数是基元的情况下,复制参数和编写类似的方法以便于调试很有用 - 许多调试器提供了“重启”运行特定方法的功能,以及参数已被修改,然后它将使用修改后的参数而不是原始参数。
答案 2 :(得分:0)
由于所有参数都是基元,因此无论是否修改它们都无关紧要。
答案 3 :(得分:0)
有些人会说这是不好的风格,但并不需要。如果您想明确不修改它们,请将字段设为最终字段。
对于长时间的方法,我认为这是一个好主意,因为它使事情变得更清楚(你可能会忘记某些方法已被某种方法进一步修改,如果你以后再回到它并进一步使用它)。对于简短的方法,无论如何都很清楚发生了什么。
答案 4 :(得分:0)
使用递归进行搜索,这样就不需要修改低参数和高参数