二分查找法Demo

package com.example.javastudy.arithmetic;

import java.util.Arrays;
import java.util.List;

public class BinarySearch {

    public static void main(String[] args) {

        /**
         * 二分查找功能:
         *  前提:数组从小到大有序排序的
         *  实现逻辑:从数组查询数据,通过先查找中间的位置(2),根据中间位置的值(2)和查找值(4)相比判断找中间值右边的数据,继续从右边中间值找,从而更快的查找到数据
         *  实现细节:
         *      获取最左边界(0)和最右边界(长度-1=5)
         *      获取中间(索引位置2)
         *      相等则等于找到了,返回索引,遍历后没有相等的返回-1
         *      如果目标值(4)大于中间值,说明数在右边,把最左边界改为中间值+1(2+1=3,这时最左边界为3最右边界为5)
         *      如果目标值小于中间值,说明数在做边,把最右边界改为中间值-1.
         *   注意事项:
         *      1.获取平均值时长度为偶数(6),则取两个值的前面那个(2)
         *      2.获取中间值用(l+r)/2,当l+r大于Integer最大值时,会成为负数,所以用>>>无符号右移
         */
        List<Integer> integers = Arrays.asList(0, 1, 2, 3, 4, 5);

        int target = 3;
        System.out.println(binarySearch(integers, target));


    }

    private static int binarySearch(List<Integer> integers, int target) {

        int l = 0;
        int r = integers.size() - 1;
        int m;
        while (l <= r) {
            // 为了防止l+r超过Integer的最大数导致变成负数,选择无符号右移
            m = (l + r) >>> 1;
            Integer mValue = integers.get(m);
            if (target == mValue) {
                return m;

            } else if (target > mValue) {
                l = m + 1;
            } else {
                r = m - 1;
            }
        }
        return -1;
    }


}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值