二分查找算法

                    二分查找法

                      By qianghaohao(Xqiang)

                  二分查找虽然简单,但是写的时候需要特别注意一下,

那就是mid的计算,很多人会写成这样mid = (begin + end) / 2,但

是这样写可能会出现溢出现象。具体原因在代码注释中已说明!

               代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//************************************************************
//            Author:qianghaohao(Xqiang)
//************************************************************

// 二分查找算法:
// 平均查找长度:ASL=log2(n+1) - 1
// 时间复杂度:  O(log(n))
int BinarySearch(const vector<int> &v, int begin, int end, const int &key) {
    int mid;
    while (begin <= end) {
        //写成这样为了防止溢出:当数组很多的时候,且begin接近
        //于INF_MAX,end也接近于INF_MAX,这样如果mid写成(begin+end)/2
        //由于begin+end肯定溢出,导致最终结果出现负数.所以mid写成如下形式:
        //  也可以将mid声明成long long类型,避免溢出
        mid = begin + (end - begin) / 2;
        if (key > v[mid]) {
            begin = mid + 1;
        } else if (key < v[mid]) {
            end = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

int main()
{
    vector<int> v = {1, 2, 3};
    cout << BinarySearch(v, 0, 2, 3) << endl;
    return 0;
}

posted on 2016-05-25 22:19  CodeNutter  阅读(273)  评论(0编辑  收藏  举报

导航