我正在尝试解决一个经典的面试问题,该问题基本上是在列表上执行二进制搜索,该列表首先增加然后减少。即使很明显我们可以实现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)可以改进吗?