来源:我的博客站 OceanicKang |《C++ 数据结构(二)向量(5)二分查找》
【注】二分查找的前提是有序向量,亦或有序线性表
接口
template <typename T> // 查找算法同一接口,0 <= lo < hi <= _size
Rank Vector<T>::search(T const &e, Rank lo, Rank hi) const {
return (rand() % 2) ? // 按各 50% 的概率随机选用
binSearch(_elem, e, lo, hi): // 二分查找算法,或者
fibSearch(_elem, e, lo, hi); // Fibonacci 查找算法
}
语义
应该便于有序向量自身的维护:V.insert(1 + V.search(e), e)
即便失败,也应给出新元素适当的插入位置
若允许重复元素,则每一组也需按其插入的次序排列
【约定】
- 在有序向量区间
A[lo, hi)
中,确定不大于 e 的最后一个
元素 - 若
-∞ < e < V[lo]
,则返回lo