java实现-《算法图解》中的二分法
废话不多说,先上代码。
public class BinarySearch {
public static void main(String[] args) {
int[] numberArray = {1, 2, 4, 5, 6};
int numberIndex = getNumberIndex(numberArray, 2);
System.out.println(numberIndex);
}
public static int getNumberIndex(int[] numberArray, int target) {
int index = -1;
//若数组为空,直接返回 -1
if (numberArray == null || numberArray.length <= 0) {
return index;
}
//若数组长度为,直接进行判断
if (numberArray.length == 1) {
return numberArray[0] == target ? 0 : index;
}
int left = 0;
int right = numberArray.length;
while (left <= right) {
int middle = left + ((right - left) >> 1);//注意不要超出int上限
if (numberArray[middle] == target) {
index = middle;
break;
} else if (numberArray[middle] > target) {
right = --middle;
} else if (numberArray[middle] < target) {
left = ++middle;
}
}
return index;
}
}
写好二分法需要注意的问题
一、while中的判断
提问: 如果把 left <= right 修改为 left < right,结果会返回什么?
答:-1
感兴趣的小伙伴可以去debug试一下。
二、求middle值
也许有人会问: 为什么求middle值要写的这么复杂呢?直接(left+right)/2不就可以了吗?
确实,《算法图解》中用python是这样写的。这里的问题就涉及到int的上限问题。在python中,如果数字的的长度超过int上限会自动转为Long。但是在java中,这种操作就会超出int上限,从而报错。left+(right-left)这种操作就避免了超出int上限的问题。
>>1 就是 除以2
这种方式是右移位操作。等价于 除以2。