二分查找算法的原理与边界问题

1.二分查找动态图

2.二分查找的基础了解

  • 概念:

在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

  • 代码重难点:

1.区间的边界符号,到底取闭区间还是开区间,如right=middle还是middle-1

2.while(left right)循环中取=还是不取

3.代码具体实现

  • [left,right]
  • [left,right)
  • (left,right]

解析[left,right]为例,求目的target

class Solution {
    public int[] BinarySearch(int[] numbers) {
        int left = 0;
        int right = numbers.length-1;
        
        while(left<=right){
            middle = left + (right-left)>>1;
            if(nums[middle]>target){
                right = middle-1;
            }else if(nums[middle]<target){
                left = middle+1;
            }else{
            return middle;
            }
        }
}

1.因为是[left,right]左闭右闭,所以这里的while取=是合法区间,是可以取的

 while(left<=right)

2.这里计算middle的时候要注意right+left可能会超出最大数字,因此为了避免这种情况,要使用下面这种方式计算

middle = left + (right-left)>>1;

3.这里的right取middle-1是因为条件判断出了nums[middle]已经是比target大,因此,就不需要再包含middle

if(nums[middle]>target) right = middle-1

[left,right)

class Solution {
    public int[] BinarySearch(int[] numbers) {
        int left = 0;
        int right = numbers.length-1;
        
        while(left<right){
            middle = left + (right-left)>>1;
            if(nums[middle]>target){
                right = middle;
            }else if(nums[middle]<target){
                left = middle+1;
            }else{
            return middle;
            }
        }
}

1.因为是[left,right)左闭右开,所以这里的while取=是不合法区间,因为当都为1的时候,就是[1,1)不合理

 while(left<=right)

2.这里的right取middle是因为[left,right),右边是)没有取right这个值,并判断出了nums[middle]已经是比target大,因此下一个搜索的区间(即左区间0到middle)就不包括middle,就需要再包含middle

if(nums[middle]>target) right = middle-1

 参考文章

(2条消息) 查找算法:二分查找_weixin_47406709的博客-CSDN博客_二分查找

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kkoneone11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值