我正在尝试创建二进制搜索功能,这是我当前的代码:
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个元素,而搜索的元素是第一个元素,则无法找到它。这个算法肯定有问题,我不能把手指放在它上面。
答案 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;
}
}