二分查找中为何需要使用+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
相关产品推荐
相关产品推荐

