linux 二进制搜索的简单函数(C++)

li9yvcax  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(119)

我写了一个简单的二进制搜索函数,但它并没有像预期的那样工作。我有一个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;

}

字符串
我很困惑,怎么了?

sf6xfgos

sf6xfgos1#

条件应为while (low <= high)
如果保持while (low < high),那么当low==high(意味着我们到达最后一个元素)时,while循环将中断并返回-1。因此,您的程序不会检查该元素。
此外,您应该使用mid=low+(high-low)/2;来防止溢出并访问所有值。
代码中的问题是,假设当low=high=1时,它将给予mid =0(由于数据转换),这是错误的。

相关问题