【发布时间】:2013-06-25 10:29:25
【问题描述】:
我正在尝试解决一个经典的面试问题,该问题基本上是在列表上执行二进制搜索,该列表首先增加然后减少。尽管很明显我们可以实现 O(log n) 我无法弄清楚我写的下面的代码有什么问题:
#include <iostream>
using namespace std;
int binarySearch(int *A, int low, int high, int key)
{
while(low < high)
{
int mid = (low + high) / 2;
if(key < A[mid])
{
if(A[mid - 1] < A[mid] && A[mid] < A[mid + 1])
high = mid - 1;
else
low = mid + 1;
}
else if(key > A[mid])
{
if(A[mid - 1] < A[mid] && A[mid] < A[mid + 1])
low = mid + 1;
else
high = mid - 1;
}
else
return mid;
}
return -(low + 1);
}
int main()
{
const int SIZE = 8;
int A[SIZE] = {3,5,7,14,9,8,2,1};
cout<<binarySearch(A, 0, SIZE, 14);
return 0;
}
我之所以问这个问题是因为我想知道两件事。 1) 代码出了什么问题,因为它对于某些值(例如“14”)失败。 2) 可以改进吗?
【问题讨论】:
-
(low + high) / 2中还有一个未经检查的整数溢出。 -
这不是经典的三元搜索问题吗?
标签: c++ algorithm binary-search