1.binSearch比较次数不平衡,一方比较次数比一方比较次数多1,所以可以有所改进,根据改进方向的不同,可以改进为fibonaccian查找(寻找比例的最优值)或者binSearch2(想办法平衡比较次数)
2.binSearch2次数平衡,但却不满足约定,为了满足约定,所以有了binSearch3
3.binSearch3看似有所遗漏,实则精巧,其正确性可以用不变性和单调性证明
#include <iostream>
#include <algorithm>
using namespace std;
int binSearch1(int *a, int e, int lo, int hi){//左闭右开
while (lo < hi){
int mi = (lo + hi) >> 1;
if (e < a[mi])
hi = mi;
else if (a[mi] < e)
lo = mi + 1;
else return mi;
}
return -1;//查找失败
}//有多个命中元素时,不能保证返回秩最大者,查找失败时,只能简单返回-1;
int binSearch2(int *a, int e, int lo, int hi){//左闭右开
while ( lo + 1 < hi ){
int mi = (lo + hi) >> 1;
(e < a[mi]) ? hi = mi : lo = mi;//经比较后确定深入[lo, mi)或[mi, hi)
}
return (e == a[lo]) ? lo : -1;//查找成功时返回对应的秩;否则统一返回-1
}//有多个命中元素时,不能保证返回秩最大者,查找失败时,简单地返回 - 1
int binSearch3(int *a, int e, int lo, int hi){//左闭右开
while (lo < hi){
int mi = (lo + hi) >> 1;
(e < a[mi]) ? hi = mi : lo = mi + 1; // 经比较后确定深入[lo, mi)或(mi, hi)
}
return --lo;
}//有多个命中元素时,总能保证返回秩最大者;查找失败时,能够返回失败的位置
int main(){
int a[10] = { 11, 9, 7, 8, 5, 6, 4, 2, 3, 1 };
sort(a,a+10);
cout << binSearch1(a, 10, 0, 10) << endl;
cout << binSearch2(a, 10, 0, 10) << endl;
cout << binSearch3(a, 10, 0, 10) << endl;
return 0;
}