二进制搜索卡住无限循环?

时间:2012-05-21 16:20:47

标签: c++ infinite-loop binary-search

我创建了这个二进制搜索,但它似乎每次都陷入循环。所有它的检查是一个向量。我不知道我需要改变什么我已经尝试了很多不同的东西。

[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;
    }
}

3 个答案:

答案 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)

在每次迭代中打印loweruppermid的值可能会很有启发性。考虑当lowerupper仅相差1时会发生什么 - 然后mid将被计算为等于lower,这意味着在lower的下一次迭代中}和upper将与前一次迭代相同,从而导致无限循环条件。