二分查找(折半查找)

二分查找(折半查找)

二分查找,时间复杂度O(log2N)。
使用前提:数组是有序的,可以暂定为递增。
下面是我推到的,注意用的是下标,下标和位置是有区别的,他们的区别甚大。
不注意使用的话将会造成很严重的问题。

推导图,主要看右下角下标法二分查找推导

原理不难,上图先设一个循环。
lowI <= highI,这个是最小下标小于等于最大下标,就循环。

判断mid下标对应数组值是否<=目标值,下雨,highI=mid-1,
为什么-1,是因为我们循环体可以半段lowI<=highI的情况,
所以可以直接跳过判断好的,我们的目的就是找到<=目标值的这个下标。
<=目标值这个下标需要经过很多次判断才能确定,不是一次就好的。
需要到循环体结束,或者你自定义=目标值break,=目标值break,
找的就是目标值下标了。
而我推到的是找到<=目标值的下标,切记,这种替换思维。

如果为小于,就lowI=mid+1,同样是抛弃mid原理。
之后当突破循环时就出来了。

下边展示两种,一种就是找到等于目标值,一种就是找到目标该插入的下标或返回该目标下标。
这两种可以变换出很多变种。

第一种,找到目标该插入的下标,或返回该目标的下标

    /**
     * @Author Stars_and_Peace
     * @Description 二分查找
     * @Date 2022/1/18 14:43
     * @param numbers,从小到大的有序整型数组
     * @param target,要寻找的数字
     * @return int  返回目标该插入的下标,或返回该目标的下标
     **/
    public static  int binarySearch(int [] numbers,int target){
        int lowI =0;
        int mid;
        int highI = numbers.length-1;
        while(lowI<=highI){
            mid=lowI+(highI-lowI)/2;
            if(numbers[mid]>target){
                highI=mid-1;
            }else if(numbers[mid]<target){
                lowI=mid+1;
            }else if(numbers[mid]==target){
                highI=mid-1;
                break;
            }
        }
       return highI+1;
    }

第二种,找到等于目标值

    /**
     * @Author Stars_and_Peace
     * @Description  二分查找
     * @Date 2022/1/18 16:09
     * @param number,输入一个数,将从1一直到n,判断是否是第一个bad,bad可以用于测试功能。
     * @return int,返回第一个bad。
     **/
    public static  int binarySearch(int number){
        int low = 1;
        int high = number;
        int bad = 5;
        int mid;
        while(low < high){
            mid = low + (high-low)/2;
            if(mid>=bad)
                high=mid;
            else
                low = mid+1;
        }
        return high;
    }
}

第二种在LeetCode上面有原题,改改就行了,第一种也是LeetCode上面的,两者的原理都离不开折半。
第一种较第二种较难些。
这里值得注意的是mid=low+(high-low)/2; 这句可以避免超出int的范围,因为一般人都喜欢mid=(low+high)/2,这样就容易超出范围。
吐槽一下我的昵称真长,还没有我的名字缩写来的舒服,cyy。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值