java经典算法1-二分查找法

1.算法描述

        1.1、前提:已有排序数组A(假设已经做好)。

        1.2、定义左边界L、右边界R、确定搜索范围,循环执行二分查找

        1.3、获取中间索引M=Floor((L+R) / 2)

        1.4、中间索引的值 A[M] 与待搜索的值 T 进行比较

                ① A[M] == T 表示找到,返回中间索引

                ② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1设置为右边界,重新查找

                ③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1设置为左边界,重新查找。

        1.5、当 L > R 时,表示没有找到,应结束循环

2.代码实现

public class Main {
    public static void main(String[] args) {
        int[] array = {1, 5, 8, 11, 19, 22, 31, 35, 40, 45, 48, 49, 50};
        int target = 11;
        int idx = binarySearch(array, target);
        System.out.println(idx);
    }
    public static int binarySearch(int[] a,int t){
        int l = 0,r=a.length -1,m;
        while (l<=r){
            m = (l + r)/2;
            if(a[m] == t){
                return m;
            }else if(a[m] > t){
                r = m - 1;
            }else{
                l = m + 1;
            }
        }
        return -1;
    }
}

3.解决整数溢出问题

        当 l 和 r 都较大时,l + r 有可能超过整数范围,造成运算错误

int m = l + (r - l) / 2;

4.其它考法

        4.1、使用二分法在序列 1,4,6,7,15,33,39,50,64,78,75,81,89,96 中查找元素 81 时,需要经过( )次比较

        4.2、代码实现,(奇数二分取中间,偶数二分取中间靠左)

public class Main {
    public static void main(String[] args) {
        int[] array = {1,4,6,7,15,33,39,50,64,78,75,81,89,96};
        int target = 81;
        int idx = binarySearch(array, target);
        System.out.println(idx);
    }
    public static int binarySearch(int[] a,int t){
        int l = 0,r=a.length -1,m,n=0;
        while (l<=r){
            n++;
            m = (l + r)/2;
            if(a[m] == t){
                return n;
            }else if(a[m] > t){
                r = m - 1;
            }else{
                l = m + 1;
            }
        }
        return -1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值