在java.util.Arrays类中提供了对有序(升序排列)数组的二分查找的方法。由于算法的思路都是一致,所以就以int[]数组的binarySearch方法做分析的例子。binarySearch底层是调用binarySearch0方法,以下是Arrays中的代码
/**
*a是一个升序排列的数组,
*fromIndex是二分查找的a的起始索引
*toIndex是二分查找的a的终止索引
*key是要查找的值
*/
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];
//比较key和中间值的大小,决定检索数组的左半边还是右半边
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // 找到key的索引值
}
return -(low + 1); // 无法找到key的索引值,返回一个负数
}