关于二分查找计算中间值可能出现的超出类型范围问题在此提供了解决方案。
在此二分查找的算法思路就不提供了,在网上有很多资料。
在此讨论二分查找中间值问题,如果你想这样写:
//找到返回索引下标,未找到返回-1
private static int binarySearch(int [] arr, int val) {
int l = 0, r = arr.length - 1, m;
while (l <= r) {
m = (l + r) / 2;
if (arr[m] == val) {
return m;
}else if (arr[m] > val) {
r = m - 1;
}else {
l = m + 1;
}
}
return -1;
}
可以测试一下,当数组的长度为 Integer.MAX_VALUE(2147483647)时 ,
第二次循环到 m = (l + r) / 2; 就会出现异常 测试:
第二次循环的时候 m(中间值) 为负数。那怎么办呢? 我的方法是使用位移运算符
测试:
没毛病!在此不讨论位移运算的细节,修改二分查找代码:
//找到返回索引下标,未找到返回-1
private static int binarySearch(int [] arr, int val) {
int l = 0, r = arr.length - 1, m;
while (l <= r) {
m = (l + r) >>> 1;
if (arr[m] == val) {
return m;
}else if (arr[m] > val) {
r = m - 1;
}else {
l = m + 1;
}
}
return -1;
}
仅是个人学习所得,如有不足之处,欢迎指正。