1. 二分查找使用的前提是数组有序(也有例外,如旋转数组)。
2. 二分查找的思想:将数组分为左右两部分,看要查找的目标位于哪一边,就对这部分再进行左右划分,如此重复不断逼近目标,直至找到目标数。
3. 二分查找的具体过程:以递增数组(称为numbers)为例,取数组的左边界(left)和右边界(right),从而获取中间的数(mid),将要查找的目标(target)与中间的数进行比较,若target>numbers[mid],则以中间数为新的左边界(left = mid+1);若target<numbers[mid],则以中间数为新的右边界(right = mid),然后再取新的中间数进行比对。如此重复直至找到目标数,或者left = right。
4. 注意事项:
(1)需要注意数组左右两侧的数,特别是右侧,因为中间数的索引(mid)会被四舍五入,因此在向右查找时需要用left = mid+1,而不能直接用left = mid;
(2)需要注意数组中不存在目标数的情况,即当二分查找结束时仍没有找到,需要返回一个特殊值进行处理。
5. 代码示例:
public class BinarySearch {
public static void main(String[] args) {
BinarySearch test = new BinarySearch();
int[] numbers = new int[]{2,7,8,100,198,1000};
int target = 8;
int res = test.getIndexOfTarget(numbers,target);
if(res == -1){
System.out.println("数组中没有找到"+target);
}else{
System.out.println(res);
}
}
public int getIndexOfTarget(int[] numbers,int target){
int left = 0;
int right = numbers.length-1;
int res = -1;
while(left<=right){
//如果二分查找已经结束,而还没有找到,则直接退出,避免死循环
if(left==right && numbers[left]!=target){
break;
}
int mid = left + (right-left)/2;
if(target < numbers[mid]){
//向左侧查找
right = mid;
}else if(target > numbers[mid]){
//向右侧查找,为避免mid被四舍五入,因此left取值为mid+1
left = mid+1;
}else if(target == numbers[mid]){
//找到了,返回索引值
res = mid;
break;
}
}
return res;
}
}
6. 未完善之处:没有考虑数组中存在多个相同值的情况。对于这种情况,我的思路是由于数组有序,相同值必然在找到的数的左侧或右侧,因此直接进行遍历直至出现不相等的数即可。
本文介绍二分查找的基本原理,包括其适用条件、查找思想及具体实现步骤,并通过示例代码展示了如何在一个有序数组中查找特定元素的过程。
1295

被折叠的 条评论
为什么被折叠?



