我为二进制搜索编写了一个简单的函数,但它没有按预期工作。我有一个4000000 32位整数的向量。通常,当我搜索一个数字时,如果它在那里,就会找到并返回索引,如果不是,则返回-1(索引始终对应于该值,但这不是该点)。
在搞乱程序时,我发现它找不到93(即使它在那里),显然,必须有更多的值找不到它。
我使用CLion,它将GDB实现为调试器,将G ++实现为编译器。
template<typename T>
int BinarySearch(vector<T>& vec, T& request)
{
int low = 0;
int high = vec.size() - 1;
while (low < high)
{
int mid = (low / 2 ) + (high / 2); // Styled it this way to avoid overflows.
// This looks like where the bug happens, basically low and high both
// become 93 while mid becomes 92,
// it then exits the loop and returns -1 because low is not lower than
// high anymore.
if (vec[mid] == request)
{
return mid;
}
else if (vec[mid] < request)
{
low = mid + 1;
}
else if (vec[mid] > request)
{
high = mid - 1;
}
}
return - 1;
}
我对此很困惑,出了什么问题?
答案 0 :(得分:2)
条件应为while (low <= high)
。
如果你将它保持为while (low < high)
,那么当low==high
(意味着我们到达最后一个元素)时,while循环将会中断并返回-1。所以,你的程序不会检查那个元素。
此外,您应该使用mid=low+(high-low)/2;
来防止溢出并访问所有值。
代码中的问题是假设当low = high = 1时,它将给出mid = 0(由于数据转换),这是错误。