普通的二分查找查找下标存在超出整数范围的可能性,导致m变成负数
public static int binarySearch(int[] a, int t) {
int l = 0, r = a.length - 1, m;
while (l <= r) {
m = (l + r) / 2;
if (a[m] == t) {
return m;
} else if (a[m] > t) {
r = m - 1;
} else {
l = m + 1;
}
}
return -1;
}
解决方法
1.公式改进
int m = l + (r - l) / 2; // l/2 + r/2 ==> l + (-l/2 + r/2) ==> l + (r-l)/2
2.位运算
m = (l + r) >>> 1;