0001 template <typename T> Rank binSearch(T* S, const T& e, Rank lo, Rank hi) { 0002 if (e < S[lo]) return lo-1; //相当于e = -inf 0003 while (1 < hi-lo) { //每步迭代一次比较、两个分支;不能提前终止 0004 Rank mi = (lo+hi)/2; //以中位数为轴点,区间宽度折半 0005 if (e < S[mi]) hi = mi; //经比较后确定深入前缀[lo,mi) 0006 else lo = mi; //或后缀[mi,hi) 0007 } //出口时hi==lo+1,区间仅含一个元素[lo] 0008 return lo; //无论成功失败,总是返回不超过e的最大者 0009 } //版本B