java实现-《算法图解》中的二分法

java实现-《算法图解》中的二分法

废话不多说,先上代码。

public class BinarySearch {
    public static void main(String[] args) {
        int[] numberArray = {1, 2, 4, 5, 6};
        int numberIndex = getNumberIndex(numberArray, 2);
        System.out.println(numberIndex);
    }

    public static int getNumberIndex(int[] numberArray, int target) {
        int index = -1;
        //若数组为空,直接返回 -1
        if (numberArray == null || numberArray.length <= 0) {
            return index;
        }
		
		//若数组长度为,直接进行判断
        if (numberArray.length == 1) {
            return numberArray[0] == target ? 0 : index;
        }


        int left = 0;
        int right = numberArray.length;
        while (left <= right) {
            int middle = left + ((right - left) >> 1);//注意不要超出int上限
            if (numberArray[middle] == target) {
                index = middle;
                break;
            } else if (numberArray[middle] > target) {
                right = --middle;
            } else if (numberArray[middle] < target) {
                left = ++middle;
            }

        }

        return index;
    }
}

写好二分法需要注意的问题

一、while中的判断
提问: 如果把 left <= right 修改为 left < right,结果会返回什么?
答:-1

感兴趣的小伙伴可以去debug试一下。
在这里插入图片描述
二、求middle值
在这里插入图片描述
也许有人会问: 为什么求middle值要写的这么复杂呢?直接(left+right)/2不就可以了吗?
确实,《算法图解》中用python是这样写的。这里的问题就涉及到int的上限问题。在python中,如果数字的的长度超过int上限会自动转为Long。但是在java中,这种操作就会超出int上限,从而报错。left+(right-left)这种操作就避免了超出int上限的问题。

>>1 就是 除以2
这种方式是右移位操作。等价于 除以2。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值