[英]Implementing Binary Search in C
关于实现二进制搜索的快速问题:-)。 这是我现在拥有的功能,我还没有弄清楚为i传递正确数字的逻辑。 但是,当我调试此函数时,我发现当value = values [i](匹配)时,会发生意外的行为。
我的意图是返回true,从而触发匹配并退出该函数。 实际行为导致返回true; 然后返回false; (不正确)。 有谁知道如何确保返回true? 退出功能? 或指导我解决错误的提示? 非常感谢!
bool search(int value, int values[], int n){
int i = ((n - 1) / 2);
if(value == values[i])
{
return true;
}
else if(value < values[i])
{
n = i;
search(value, values, n);
}
else if(value > values[i])
{
n = (i * 1.5);
search(value, values, n);
}
return false;
}
您缺少几个return
关键字。
search(value, values, n);
应该:
return search(value, values, n);
有两条这样的线。
没有这些return
关键字,该函数将始终结束并返回false
。
更新,以回应OP的评论
您的函数没有进行任何检查,以确保不会超出范围地访问values
。 我认为它将永远不会尝试访问具有负索引的任何内容,但是它有机会访问索引高于允许的索引值的元素。 我建议更改功能以使用:
int search(int value, int values[], int start, int end)
{
if ( start >= end )
{
return 0;
}
int mid = (start + end)/2;
if(value < values[mid])
{
return search(value, values, start, mid);
}
else if(value > values[mid])
{
return search(value, values, mid+1, end);
}
else
{
return (value == values[mid]);
}
}
与右调用它start
和end
从函数外部调用时的值。
int values[] = {1, 4, 6, 8};
bool found = search(2, values, 0, sizeof(values));
让我评论一下,有可能使用确切的接口编写有效的函数版本。 就像是:
bool search(int value, int values[], int n)
{
if (n == 0) // searching in an empty set?
return false;
int i = (n - 1) / 2;
if (value == values[i]) // the middle contains value?
return true;
else if (value < values[i]) // would be value to the left of i
return search(value, values, i);
else // so it would be to the right; no need of if (value > values[i])
return search(value, values + i + 1, n - i - 1);
}
该函数具有与您相同的签名,它通过元素n
的数量和数组指针的基数来减小搜索范围。 在中心的左侧执行搜索时,元素数减少到i
而在数组基地址的右侧进行搜索时,如果元素搜索数增加i + 1
且元素数量减少i + 1
。
请注意, if
没有必要,则使用第三位。 如果达到,则谓词将始终为true,因为value
不等于也不小于value[i]
,因此它更大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.