看中间那个

8 分钟

二分查找每一轮都盯着当前范围最中间的元素。用 leftright 两个下标表示范围两端,中间下标是

(整数除法自动向下取整)。取出 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 是几?

登录 后可看答案