binSearch的三种形式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36813793/article/details/79972883

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;
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页