二分查找

二分查找是有序数组查找的常用算法。时间复杂度为 $\mathcal{O} (logn)$,无论是成功还是失败,其平均查找长度[1]都是 $\mathcal{O} (1.50 \cdot logn)$。

不存在:返回不大于e的最后一个元素

template <typename T> 
Rank Vector<T>::search(T const &e, Rank lo, Rank hi) const {
  while (lo < hi) {
    Rank mi = (lo + hi) >> 1;
    if (e < data_[mi]) {
      hi = mi;
    } else if (data_[mi] < e) {
      lo = mi + 1;
    } else {
      return mi;
    }
  }
  return -1;
}

  1. 查找长度是关键码的比较次数 ↩︎