You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二分查找中为何需要使用+1和-1?

二分查找中使用mid+1和mid-1的核心逻辑

这段代码实现的是有序数组的二分查找,为什么调整边界时要写mid+1和mid-1,核心原因不是数组索引从0开始,而是要彻底排除已经验证过的位置,确保搜索区间每次都在严格缩小,避免死循环。

具体拆解逻辑:

  • 当values[mid] == valueToFind时,直接返回mid,这一步已经确认mid就是目标位置,无需再考虑它。
  • 当values[mid] < valueToFind:
    因为数组是升序的,目标值肯定在mid的右侧,mid本身已经比目标小,不可能是答案,所以下一次搜索的左边界必须从mid+1开始。如果只写l = mid,会触发死循环:比如l=3,r=4时,mid=(3+4)/2=3,若values[3] < 目标,设置l=3后,下一次循环还是l=3,r=4,mid还是3,永远重复判断同一个位置,循环无法退出。
  • 当values[mid] > valueToFind:
    同理,目标值肯定在mid的左侧,mid本身已经比目标大,不可能是答案,所以右边界要设为mid-1。如果写r = mid,同样会在l=3,r=4这类场景下陷入死循环:mid=3,values[3] > 目标,设置r=3后,下一次循环l=3,r=3,mid还是3,重复判断,永远无法退出循环。

本质总结:

二分查找的核心是不断缩小有效搜索区间,每一次判断后,mid这个位置已经被完全验证过——要么是答案,要么绝对不是答案,所以必须把它从下一次的搜索区间里移除。如果保留mid,区间就无法有效缩小,在边界条件下就会陷入死循环,这才是必须用mid+1和mid-1的根本原因。

附上你提供的代码:

private static int[] values = { 1, 3, 5, 7, 10, 13, 15, 17 };
public static int FindValue(int valueToFind)
{
    int l = 0;
    int r = values.Length - 1;
    while (l <= r)
    {
        var mid = (l + r) / 2;
        if (values[mid] == valueToFind)
            return mid;
        if (values[mid] < valueToFind)
            l = mid + 1; // 核心:排除已验证的mid位置
        else
            r = mid - 1; // 核心:排除已验证的mid位置
    }
    return -1;
}

内容的提问来源于stack exchange,提问作者Jess Chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:21:12