/**
* 二分法找值
* @param arr
* @param item
* @return 下标位置
*/
public static int binary_search(int [] arr,int item){
int result = -1;
int low = 0; //最小下标
int high = arr.length - 1;//最大下标
while (low <= high) {
int mid = (low + high) / 2;
int guss = arr[mid];
if (guss == item) {
return mid;
}
//猜想的数比 item 大
if (guss >= item) {
high =mid-1;
}else{
//猜想的数比 item 小
low=mid+1;
}
}
return result;
}
public static void main(String [] args){
/**
* 思想:
* 在一组有序数组中,
* (首次最小下标 + 最大下标)/2 获取向下取整的下标
* 再比较对应是否相等,
* 1.猜想的值 比目标值大,说明目标值的下标范围在:0 - 向下取整范围;
* 2.猜想的值 比目标值小,说明目标值的下标范围在:向下取整范围 - 最大下标;
* 类推
*/
int [] arr={1,3,2,5,7,11,89,12,78};
Arrays.sort(arr);
int i = binary_search(arr, 89);
System.out.println(i);
}
扩展:
让我想到一个面试分享的试题: 在一百层高楼,给你两块玻璃,如何快速找到玻璃破碎的临界点?
二分法,第一块玻璃在50层楼时,往下扔,
1).玻璃破碎,说明临界点在:1 -50 层;第二块,从1层开始一步步测试;
2 ). 玻璃没有破碎,那么临界点在:51 -100 层,然后再次二次二分法,再次测试