参考代码,以下代码仅供参考,肯定会有更优和更通用的写法
public class A {
/**
* @param arrays 已排序好的数组
* @param fromIndex 从哪里开始计数,一般都是0
* @param toIndex 数组长度
* @param key 要找的值
* @return
*/
public static int binarySearch(Object[] arrays, int fromIndex, int toIndex,
Object key) {
//先定义一个数组开始比较开始的范围下标
int low = fromIndex;
//再定义一个数组比较结束的范围下标
int high = toIndex - 1;
//开始做二分,不断赋值
while (low <= high) {
//取中间值
int mid = (low + high) >>> 1;
Comparable comparable = (Comparable) arrays[mid];
//比较中间数值和要找的key值的大小
int result = comparable.compareTo(key);
//如果result小于0,则表示中间值比要找的key小,因为是排好序的。所以key值会在mid和high之间
if (result < 0) {
//所以重新赋值low,把范围缩小到mid+1到high之间
low = mid + 1;
//如果result大于0,则表示中间值比要找的key大,因为是排好序的。所以key值会在low和mid之间
} else if (result > 0) {
//所以重新赋值high,把范围缩小到low和mid-1之间
high = mid - 1;
} else {
//否则就是相等,说明找到了
return mid;
}
}
//循环如果走出来了,那么说明就没找大匹配key的结果,那么就返回负数
return -(low + 1);
}
}
测试main函数
public static void main(String[] args) {
Integer[] arrays = {1, 3, 6, 7, 9, 10, 16};
System.out.println(A.binarySearch(arrays, 0, arrays.length, 10));
}
运行结果