二分查找算法

二分查找算法简要介绍

  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;
}
阅读更多
版权声明:本文为博主原创文章,如转载请注明出处. https://blog.csdn.net/zyj_zhouyongjun183/article/details/79954748
个人分类: 算法
想对作者说点什么? 我来说一句

数据结构查找算法

2011年12月26日 36KB 下载

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

不良信息举报

二分查找算法

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭