看中间那个
约 8 分钟
二分查找每一轮都盯着当前范围最中间的元素。用 left、right 两个下标表示范围两端,中间下标是
(整数除法自动向下取整)。取出 a[mid] 和目标比较:相等就找到;否则根据大小决定下一步往左半还是右半。
int mid = (left + right) / 2;
if (a[mid] == x) /* 找到 */ ;
else if (a[mid] < x) left = mid + 1;
else right = mid - 1;
一个经典坑是 mid 的写法:当 left + right 很大时,两数相加可能超过 int 上限溢出,更稳妥的是
两者结果一样,但后者不会溢出,比赛里数据大时推荐用它。例如 left=0, right=8,,正好是中间那个。
小纸条
左端 left=0、右端 right=8,中间 mid 是几?
登录 后可看答案