二分法查找【Java】

1.使用二分法的前提:数组为有序数组  , 数组中无重复元素

2.二分法查找又叫折半查找,先定义三个指针(left,right,middle),left指向数组的第一个元素,right指向数组的最后一个元素,middle指向(left+right)/2,然后进行查找,如果target(值) > nums[middle],则改变left值,在后半部分再进行二分法查找;如果target < nums[middle],则改变right值,在前半部分再进行二分法查找。注意:left,right和middle都是数组的下标

3.易错:对区间的定义要想清楚,区间的定义就是不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。掌握while(left < right) 和 while(left <= right),以及right = middle和right = middle - 1

第一种写法:(左闭右闭区间while(left <= right))

package pro1;

public class MyCode {

	public static int getIndex(int[] nums,int target) {
		 
        //初始化最小值的索引为0
        int left = 0;
        //初始化最大值的索引为nums.length-1
        int right = nums.length - 1;
 
        //首尾相加再除以2得出中间索引
        int mid = (left + right) / 2;
 
        while (left<=right) { //说明是左闭右闭区间,例如[1,1]
            if (target > nums[mid]) { //明确说明target > nums[mid],就不能包含mid,所以left=mid+1
                //如果查询的值比中间值大,则往右边区域找,就把最小索引改为中间索引右移一位
                left = mid + 1;
            } else if (target < nums[mid]) {
                //如果查询的值比中间值小,则往左边区域找,就把最大索引改为中间索引左移一位
                right = mid - 1;
            } else {
                //剩余的情况就是查询到了结果,那么就直接返回索引。
                return mid;
            }
            mid = (left + right) / 2;
        }
        //没有查询到,则返回-1
        return -1;
    }
public static void main(String[] args) {
		    
	        int[] nums = {-1, 0, 3, 5, 9, 12};
	        //定义需要查询的值
	        int target = 9;
	        int index= getIndex(nums,target);
	        System.out.println("查询值所对应的索引为:" + index);
	    }
}

第二种写法:(左闭右开区间while(left <right))

package pro1;

public class MyCode {

	public static int getIndex(int[] nums,int target) {
		 
        //初始化最小值的索引为0
        int left = 0;
        //初始化最大值的索引为nums.length,如果nums.length为5,则表示数组nums中有5个元素,其索引分别为0、1、2、3和4。
        int right = nums.length; //左闭右开区间如[1,2),所以right可以等于nums.length,因为不会取nums.length
 
        //首尾相加再除以2得出中间索引
        int mid = (left + right) / 2;
 
        while (left < right) { //说明是左闭右闭区间,例如[1,1]
            if (target > nums[mid]) { //明确说明target > nums[mid],就不能包含mid,所以left=mid+1
                //如果查询的值比中间值大,则往右边区域找,就把最小索引改为中间索引右移一位
                left = mid + 1;
            } else if (target < nums[mid]) {
                //如果查询的值比中间值小,则往左边区域找,就把最大索引改为中间索引左移一位
                right = mid ;  //因为是左闭右开区间,所以right = mid不会包含mid
            } else {
                //剩余的情况就是查询到了结果,那么就直接返回索引。
                return mid;
            }
            mid = (left + right) / 2;
        }
        //没有查询到,则返回-1
        return -1;
    }
public static void main(String[] args) {
		    
	        int[] nums = {-1, 0, 3, 5, 9, 12};
	        //定义需要查询的值
	        int target = 9;
	        int index= getIndex(nums,target);
	        System.out.println("查询值所对应的索引为:" + index);
	    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值