【二分查找法】
在java面试过程中,经常有笔试题,或者直接被问道,如果快速判断某个数字是否包含在数组中。
如果你之前没有了解过二分算法,可能第一反应就是循环遍历依次比较,或者建立哈希表去查询。其实效率最高的,应该数【二分查找】了。
那什么是【二分查找呢】?
不知道在聚会的时候,大家有没有玩过这样一个游戏…【猜数字】
出题玩家随便写一个100以内的数字(当然这个数字只有自己知道),然后其他玩家猜,猜大了提示大了,猜小了提示小了,越到后面,猜的范围也越来越小了,直到有人猜中,或者剩下最后一个数被迫猜中,从而接受惩罚。
猜答案有一定随机性,但如果每次把范围都缩小一半的话,猜中的几率不也就越来越大了???
【二分查找】就是这个原理了,一个长度可能很大很大的数组,我们可能只查找了不到10次就找出来了,跟之前的依次遍历挨个判断效率明显提升不少!!!!
【下图1展示了代码实现,输出数组中某个数字的坐标。】
这里有一点需要注意,因为每个数据类型都有自己最大长度,为了防止溢出,我们一般用mid=start+(end-start)/2 来代替mid=(start+end)/2
public static int binarySearch(int []array,int target){
//查找范围起点
int start=0;
//查找范围终点
int end=array.length-1;
//查找范围中位数
int mid;
while(start<=end){
//mid=(start+end)/2 有可能溢出
mid=start+(end-start)/2;
if(array[mid]==target){
return mid;
}else if(array[mid]<target){
start=mid+1;
}else{
end=mid-1;
}
}
return -1;
}
public static void main(String[] args) {
int[] array = new int[1000];
for(int i=0; i<1000;i++){
array[i] = i;
}
System.out.println(binarySearch(array, 173));
}