我创建了这个二进制搜索,但它似乎每次都陷入循环。所有它的检查是一个向量。我不知道我需要改变什么我已经尝试了很多不同的东西。
[1,2,4,6]如果我搜索4是永远不会被发现它会继续击中较低= mid + 1。
bool SortSearch::binarySearcher(int size, int val)
{
int lower = 0, upper = size - 1, mid;
while (lower < upper)
{
mid = (lower + (upper-lower))/2;
if (students[mid].getID() > val)
upper = mid - 1;
else if (students[mid].getID() < val)
lower = mid + 1;
else if (students[mid].getID() == val)
return true;
else
return false;
}
}
答案 0 :(得分:9)
我相信:
mid = (lower + (upper-lower))/2;
应该是:
mid = lower + (upper-lower)/2;
我可能会补充道:
assert(lower <= mid && mid <= upper);
另外,:
return false;
应该在循环之后。检查<
和>
后,唯一可能的结果是==
(带有整数),这样最终的else
子句就永远不会出现。 (如果你使用索引的浮点类型,那么你可以得到一些奇怪的情况,包括NaN,无穷大,也许是负零。)
调高编译器的警告级别。它本应该警告你关于无法访问的代码和没有返回的路径。
答案 1 :(得分:3)
此:
mid = (lower + (upper-lower))/2;
应该是:
mid = lower + (upper-lower) / 2;
或者只是平均值:
mid = (upper + lower) / 2;
答案 2 :(得分:2)
在每次迭代中打印lower
,upper
和mid
的值可能会很有启发性。考虑当lower
和upper
仅相差1时会发生什么 - 然后mid
将被计算为等于lower
,这意味着在lower
的下一次迭代中}和upper
将与前一次迭代相同,从而导致无限循环条件。