目录
一、二分法查找的思想
二分查找法使用的基本条件是一个有序的数组,数组默认是递增的。通过从数组头部和尾部折半,判断要查找的数和mid位置数值的大小,来判断要查找的数是在哪一半,之后继续折半查找,直至找到这个数或者最后小端大于大段则结束查找!
- 首先选择数组中间的数字和需要查找的目标值比较
- 如果相等最好,直接就可以返回答案
- 如果不相等
(1)如果中间值(mid)> 需要查找的值(target)--->向左找,中间数字向右的所有数字都大于目标值,全部排除
(2)如果中间值(mid)< 需要查找的值(target)--->向右找,中间数字向左的所有数字都小于目标值,全部排除
二、二分法查找需要满足的条件
- 用于查找的内容逻辑上来说是需要有序的
- 查找的数量只能是一个,而不是多个
三、二分法查找的两种方式
因为查找的区间是不断迭代的,所以确定查找的范围十分重要,主要就是左右区间的开和闭的问题,开闭不一样,对应的迭代方式也不一样,有以下两种方式:
- 左闭右闭 [left,right]
- 左闭右开 [left,right)
但是千万不要一直纠结中间的数字两边的数字数量不一样这个问题,因为:
- 两边数量不一样是一定会出现的情况
- 但是这种情况并不影响我们对中间数字和目标数字大小关系的判断
(1)只要中间数字大于目标数字,就排除右边的
(2)只要中间数字小于目标数字,就排除左边的
- 所以数组长度是偶数还是奇数这个真的不重要,不影响怎么排除的问题,无非是多排除一个数字或者少排除一个数字
真正影响的是中间那个数字到底该不该加入下一次的查找中,也就是边界问题
代码如下:
package arithmetic;
/**
* @desc 二分查询 (非递归方式)
* 案例:
* {1,3,8,10,11,67,100},编程实现二分法查找,要求使用非递归方式完成。
* @author lf
* @Date 2021
*/
public class BinarySearchAlgorithm {
public static void main(String[] args){
int[] arr = {1,3,8,10,11,67,100};
int index = binarySearch(arr,8);
if (index != -1){
System.out.println("找到了,下标为:"+index);
}else{
System.out.println("没有找到---");
}
}
private static int binarySearch(int[] arr,int target){
int left = 0;
int right = arr.length - 1;
while(left <= right){
int mid = (left + right) / 2;
if (arr[mid] == target){
return mid;
}else if(arr[mid] > target){
//中间值(mid) > 需要查找的值(target) ---> 向左找
right = mid - 1;
}else{
//中间值(mid) < 需要查找的值(target) ---> 向右找
left = mid + 1;
}
}
return -1;
}
}
查找数组为2的下标: