binSearch的三种形式

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值