仅搜索功能有效

时间:2016-01-29 02:16:11

标签: c search

我正在尝试创建二进制搜索功能,这是我当前的代码:

bool _search(int value, int values[], int start, int end);

/*
 * Main search function
 */
bool search(int value, int values[], int n) {
    if(value < 0)
            return false;
    sort(values, n);
    return _search(value, values, 0, n);
}

bool _search(int value, int values[], int start, int end) {
    if(start < end) {
        // get the mean for comparing
        int mean = (start + end) / 2;
        if(value == values[mean]) // middle
            return true;
        else if(value < values[mean]) // left half
            return _search(value, values, start, mean - 1);
        else // right half
            return _search(value, values, mean + 1, end);
    } else
        return false;
}

我正在使用一个常量种子将随机数传递给程序,如果我传入的数字量是861或更低,它可以正常工作。但是,如果它获得862或更高的数字,则无法找到值。奇怪的。所以我尝试传递一个非常高的数字,比如1862年。它找到了它!好的...... 2000年怎么样?不。 3000?对。 4000?不。 5000?不。 6000?烨。

这里发生了什么?

编辑:此外,如果数组只有3个元素,而搜索的元素是第一个元素,则无法找到它。这个算法肯定有问题,我不能把手指放在它上面。

1 个答案:

答案 0 :(得分:2)

您的search功能不正确:包含start,但应排除end。当你递归时,你不应该停留在mean - 1,但是mean,否则,你会错过一些条目,如果不应该搜索可能会失败。

以下是更正版本:

bool _search(int value, int values[], int start, int end) {
    if (start < end) {
        // get the mean for comparing
        int mean = (start + end) / 2;
        if (value == values[mean]) // middle
            return true;
        else
        if (value < values[mean]) // left half
            return _search(value, values, start, mean);
        else // right half
            return _search(value, values, mean + 1, end);
    } else {
        return false;
    }
}