我写了一个简单的二进制搜索函数,但它并没有像预期的那样工作。我有一个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;
}
字符串
我很困惑,怎么了?
1条答案
按热度按时间sf6xfgos1#
条件应为
while (low <= high)
。如果保持
while (low < high)
,那么当low==high
(意味着我们到达最后一个元素)时,while循环将中断并返回-1。因此,您的程序不会检查该元素。此外,您应该使用
mid=low+(high-low)/2;
来防止溢出并访问所有值。代码中的问题是,假设当low=high=1时,它将给予mid =0(由于数据转换),这是错误的。