我正在尝试使用while
循环实现二进制搜索。当我正在寻找的int
在阵列中时似乎有效;但是,当我正在搜索的int
不存在时,程序似乎陷入循环,而不返回false。我一直在使用gdb,但我仍然无法弄清楚这个bug。正如你所看到的,我可能会添加一些额外的if语句等等,试图解决这个问题。
bool search(int value, int values[], int n) {
sort(values, n);
int begin = 0;
int end = (n - 1);
if (n < 1) {
return false;
}
while (end > begin + 1) {
int center = ((begin + end) / 2);
if (values[0] == value) {
return true;
}
if (begin == value) {
return true;
}
if (end == value) {
return true;
}
if (end == (begin + 1) || end == begin) {
if (end == value || begin == value) {
return true;
} else {
return false;
}
}
if ((values[center]) == value) {
return true;
} else
if ((values[center]) > value) {
end = center;
} else
if ((values[center]) < value) {
begin = center;
} else {
return false;
}
}
// TODO: implement a searching algorithm
return false;
}
答案 0 :(得分:0)
你为什么要这样做?
if (values[0]==value)
{
return true;
}
if (begin == value)
{
return true;
}
if (end == value)
{
return true;
}
if (end == (begin+1) || end == begin)
{
if (end == value || begin == value)
{
return true;
}
else
{
return false;
}
}
他们没有必要。你可以像下面这样做
while(end>beg+1 && values[center]!=value)
{
if ((values[center])>value)
end = center-1;
else if (values[center]<value)
begin = center+1;
center=(end+begin)/2;
}
if(values[center]==value)
return true;
else return false;
}
我不明白你使用sort(values,n);
的原因
如果它是C ++代码,则将其用作sort(values,values+n);
如果它是C代码,则根据您的阵列大小和时间,使用任何算法对数组进行排序。
谢谢。
答案 1 :(得分:0)
你不必要地过度复杂这个简单的事情。 您可以删除代码中的所有额外内容并使用此
`if ((values[center])==value)
{
return true;
}
else if ((values[center])>value)
{
end = center-1;
}
else if ((values[center])<value)
{
begin = center+1;
}
`
答案 2 :(得分:0)
您的代码太复杂了。以下是一些提示:
您应该使用包含左索引和右索引的范围,这在C中是惯用的,并且会导致更简单的算法。
如果center = start + (end - start) / 2;
和center = (start + end) / 2;
非常大,您应该计算start
而不是end
以避免潜在的整数溢出。
数组大小应为size_t
,可能大于int
。
将值与范围中间元素的值进行比较:
如果范围为空,则找不到该值,返回false。
这是一个更简单的版本:
bool search(int value, int values[], size_t n) {
// Assuming values is sorted before calling this function
//sort(values, n);
size_t begin = 0;
size_t end = n;
while (begin < end) {
size_t center = begin + (end - begin) / 2;
if (value == values[center]) {
return true;
}
if (value < values[center]) {
end = center;
} else {
begin = center + 1;
}
}
return false;
}