用于二进制搜索的Buggy简单函数(C ++)

时间:2017-03-24 19:49:15

标签: c++ linux g++ binary-search-tree

我为二进制搜索编写了一个简单的函数,但它没有按预期工作。我有一个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 个答案:

答案 0 :(得分:2)

条件应为while (low <= high)

如果你将它保持为while (low < high),那么当low==high(意味着我们到达最后一个元素)时,while循环将会中断并返回-1。所以,你的程序不会检查那个元素。

此外,您应该使用mid=low+(high-low)/2;来防止溢出并访问所有值。
代码中的问题是假设当low = high = 1时,它将给出mid = 0(由于数据转换),这是错误。