目录
1.6.4 查找
template <typename T> //在有序向量的区间[lo, hi)内,确定不大于e的最后一个节点的秩
Rank Vector<T>::search ( T const& e, Rank lo, Rank hi ) const { //assert: 0 <= lo < hi <= _size
return ( rand() % 2 ) ? //按各50%的概率随机使用二分查找或Fibonacci查找
binSearch ( _elem, e, lo, hi ) : fibSearch ( _elem, e, lo, hi );
}
1.6.5 二分查找(版本A)
1.6.5.1 减而治之
// 二分查找算法(版本A):在有序向量的区间[lo, hi)内查找元素e,0 <= lo <= hi <= _size
template <typename T> static Rank binSearch ( T* A, T const& e, Rank lo, Rank hi ) {
/*DSA*/printf ( "BIN search (A)\n" );
while ( lo < hi ) { //每步迭代可能要做两次比较判断,有三个分支
/*DSA*/ for ( int i = 0; i < lo; i++ ) printf ( " " ); if ( lo >= 0 ) for ( int i = lo; i < hi; i++ ) printf ( "....^" ); printf ( "\n" );
Rank mi = ( lo + hi ) >> 1; //以中点为轴点
if ( e < A[mi] ) hi = mi; //深入前半段[lo, mi)继续查找
else if ( A[mi] < e ) lo = mi + 1; //深入后半段(mi, hi)继续查找
else return mi; //在mi处命中
/*DSA*/ if ( lo >= hi ) { for ( int i = 0; i < mi; i++ ) printf ( " " ); if ( mi >= 0 ) print