二分查找算法

二分查找算法简要介绍

  1. 应用二分查找算法的前提是输入序列有序:升序或者降序;
  2. 二分查找算法,每次取输入序列seq的中间下标middle对应的值与需要查找的key比较;
  3. 对于升序序列而言:如果key>seq[middle],则将middle+1作为下一次查找的左边界,右边界不变;
  4. 如果key < seq[middle],则将middle-1作为下一次查找的右边界,左边界不变;
  5. 如果key == seq[middle],则找到查找值的下标;
  6. 如果左边界小于右边界,则查找结束,未找到key;
  7. 重复第2到6步;
  8. 由于每轮查找都会让输入序列减半,故算法复杂度为O(log2n);

代码实现

/************************************************************************/
/* 二分查找,假设输入序列为升序排列的有序vector;
left输入序列的左边界,right为输入序列的右边界;key为查找对象,index为返回所
查找对象的vector下标;*/
/************************************************************************/
bool Binary_Search(vector<long long> &OrderedSeq,unsigned left,unsigned right,long long key, unsigned &index)
{
    unsigned middle = 0;

    //key不在vector输入范围之类,直接返回false;
    if(key>OrderedSeq[right] ||key<OrderedSeq[left])
    {
        cout<<"The key can not be found!"<<endl;
        return false;
    }

    //while结束条件为左边界大于右边界,未找到key对应的下标;
    while(left<=right)
    {
        //取左右边界的中间数;
        middle = (right-left)/2 + left;

        //如果key小于middle,则将middle-1设定为右边界,左边界不变;
        if(key<OrderedSeq[middle])
            right = middle - 1;
        //如果key大于左边界,则将middle+1设定为左边界,右边界不变;
        else if(key>OrderedSeq[middle])
            left = middle + 1;
        //找到对应key所在下标,返回下标;
        else
        {
            index = middle;
            return true;
        }
    }

    return false;
}

int main(int argc, char* argv[])
{
    vector<long long> seq;
    unsigned idx = 0;
    //产生升序排列的斐波拉契数列;
    cout<<"The Fibonacci_Seq_Gen out:"<<Fibonacci_Seq_Gen(seq, 51)<<endl;

    //对升序排列的数列做二分查找;
    Binary_Search(seq, 0,seq.size()-1,seq[9],idx);
    cout<<"The binary search result is:"<<idx<<endl;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值