二分查找算法
二分查找法
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) 编辑 收藏 举报