C语言中如何高效实现二分查找算法,核心技巧是什么?
- 内容介绍
- 文章标签
- 相关推荐
本文共计875个文字,预计阅读时间需要4分钟。
由于边界条件、溢出、迭代器失效等问题,以下代码示例可能无法正常工作:
- 它要求容器已排序(升序),且支持随机访问迭代器(
vector、array可用,list不行) - 返回第一个 ≥ 目标值的迭代器,没找到就返回
end(),不用自己判空 - 内部用的是半开区间
[first, last),和绝大多数 STL 算法一致,不会因闭区间习惯出错 - 整数下标场景下,别直接用
int算中点:mid = (left + right) / 2可能溢出;std::lower_bound内部用std::distance安全处理
手写二分时 mid 计算必须用 left + (right - left) / 2
不是为了“看起来高级”,是防止 left 和 right 都接近 INT_MAX 时加法溢出 —— 这种溢出不报错,但结果变成负数,后续下标访问直接 UB(未定义行为)。
本文共计875个文字,预计阅读时间需要4分钟。
由于边界条件、溢出、迭代器失效等问题,以下代码示例可能无法正常工作:
- 它要求容器已排序(升序),且支持随机访问迭代器(
vector、array可用,list不行) - 返回第一个 ≥ 目标值的迭代器,没找到就返回
end(),不用自己判空 - 内部用的是半开区间
[first, last),和绝大多数 STL 算法一致,不会因闭区间习惯出错 - 整数下标场景下,别直接用
int算中点:mid = (left + right) / 2可能溢出;std::lower_bound内部用std::distance安全处理
手写二分时 mid 计算必须用 left + (right - left) / 2
不是为了“看起来高级”,是防止 left 和 right 都接近 INT_MAX 时加法溢出 —— 这种溢出不报错,但结果变成负数,后续下标访问直接 UB(未定义行为)。

