二分查找法
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;
}