我想为整数数组实现二进制搜索。我确保数组按递增顺序排序。但我的功能是没有跟踪所有情况,一些检查失败。我在这里错过了什么?
Value
代表我试图找到的整数。
bool search(int value, int array[], int n)
{
int left = 0;
int right = n - 1;
int middle = (left + right) / 2;
while (right >= left)
{
if (array[middle] == value)
return true;
else if (array[middle] < value)
right = middle;
else if (array[middle] > value)
left = middle + 1;
middle = (left + right) / 2;
}
return false;
}
我的猜测是没有预测到一些左边界或右边界的情况。我对while
条件也不太满意。
答案 0 :(得分:6)
左右混合,如果array[middle] < value
你需要更改left
。
bool search(int value, int array[], int n)
{
int left = 0;
int right = n - 1;
int middle = left + (right - left) / 2;
while (right >= left)
{
if (array[middle] == value)
return true;
else if (array[middle] > value)
right = middle - 1;
else if (array[middle] < value)
left = middle + 1;
middle = (left + right) / 2;
}
return false;
}
进一步改进可以是:
您可以排除middle
部分中的else
,因为您已经证明它不是正确的值(right = middle;
=&gt; right = middle - 1;
)
第二个else if
可以替换为else
。如果它不是值而不是更小,则不必测试它是否更大。
答案 1 :(得分:-1)
标准二进制搜索算法可以在任何地方找到。但只是纠正你的代码:
bool search(int value, int array[], int n)
{
int left = 0;
int right = n - 1;
int middle;
while (left <= right)
{
middle = (left + right) / 2;
if (value > array[middle] )
left = middle + 1;
else if (value < array[middle])
right = middle - 1;
else
return true;
}
return false;
}