1 二分查找(版本A)
在有序向量的区间[lo,hi)内查找元素e.
template <typename T> static Rank binsearch(T *A,T const& e,Rank lo,Rank hi){
while(lo<hi){
Rank mi=(lo+hi)>>1;
if(e<A[mi]) hi=mi;
else if(e>A[mi]) lo=mi+1;
else return mi;
}
return -1; //查找失败
} // 有多个命中元素时,不能保证返回秩最大者;查找失败时,简单的返回-1,而不能指示失败的位置。
时间复杂度
2 Fibonacci查找
在[lo,hi),中查找元素e
template <typename T> static Rank fibsearch(T *A,T const & e,Rank lo,Rank hi){
Fib fib(hi-lo); //用O(long_phi(n=hi-lo)时间创建fib数列
while(lo<hi){
while(hi-lo<fib.get() ) fib.prev();
Rank mi=lo+fib.get()-1; //确定形如Fib(k)-1的轴点
if (e<A[mi]) hi=mi;
else if(A[mi]<e) lo=mi+1;
else return mi;
}
时间复杂度
3 二分查找(版本B)
template <typename T> static Rank binSearch(T* A, T const& e,Rank lo,Rank hi){
while(1<hi-lo){//每步迭代仅需做一次比较判断,有两个分支;成功查找不能提前终止
Rank mi=(lo+hi)>>1;
(e<A[mi])?hi=mi:lo=mi; //经比较后确定深入[lo,mi)或[mi,hi)
}
return (e==A[lo])?lo:-1;
}//有多个命中元素时,不能保证返回秩最大者;查找失败时,简单地返回-1,而不能指示失败的位置
时间复杂度为
4 二分查找(版本C)
template<typename T> static Rank binSearch(T* A,T const& e,Rank lo,Rank hi){
while(lo<hi){
Rank mi=(lo+hi)>>1;
(e<A[mi])?hi=mi:lo=mi+1; //深入[lo,mi)或[mi+1,hi)
}//成功查找不能提前退出
return --lo;//循环结束时,lo为大于e的元素的最小秩,故lo-1即不大于e元素的最大秩
}//有多个命中元素时,总能保证返回秩最大者;查找失败时,能够返回失败的位置
时间复杂度为