C++ 使用常量指针进行二进制搜索
我们应该实现一个函数,它使用二进制搜索来检查数组中是否有值C++ 使用常量指针进行二进制搜索,c++,arrays,binary-search,C++,Arrays,Binary Search,我们应该实现一个函数,它使用二进制搜索来检查数组中是否有值键,并给出true或false 我的想法是这样的: bool binary_search(const int* begin, const int * end, int key){ if(begin < end){ int mid = (end-begin)/2; if(mid == key){ return true; }else if (key <
键
,并给出true或false
我的想法是这样的:
bool binary_search(const int* begin, const int * end, int key){
if(begin < end){
int mid = (end-begin)/2;
if(mid == key){
return true;
}else if (key < mid){
int h = mid-1;
end = &h;
binary_search(begin, end, key);
}else if (mid < key){
int i = mid+1;
begin = &i;
binary_search(begin, end, key);
}
}else{
return false;
}
}
bool二进制搜索(const int*begin,const int*end,int key){
如果(开始<结束){
int mid=(结束-开始)/2;
如果(mid==键){
返回true;
}否则,如果(键<中间){
int h=mid-1;
结束=&h;
二进制搜索(开始、结束、键);
}否则如果(中间<键){
int i=mid+1;
begin=&i;
二进制搜索(开始、结束、键);
}
}否则{
返回false;
}
}
但它不会给出任何输出,而是给出了错误
警告:控件到达非无效函数的末尾[-Wreturn类型]
我真的不明白我必须在这里做什么,所以有人能解释一下这里出了什么问题吗?您应该
在所有可能的分支中返回
改变
binary_search(begin, end, key);
到
返回递归调用的结果。对于这些if-else语句
}else if (key < mid){
int h = mid-1;
end = &h;
binary_search(begin, end, key);
}else if (mid < key){
int i = mid+1;
begin = &i;
binary_search(begin, end, key);
}
int mid = (end-begin)/2;
if(mid == key){
int h = mid-1;
end = &h;
存在与数组索引进行比较的键,而不是将键与索引为mid的数组中元素的值进行比较
还是这些声明
}else if (key < mid){
int h = mid-1;
end = &h;
binary_search(begin, end, key);
}else if (mid < key){
int i = mid+1;
begin = &i;
binary_search(begin, end, key);
}
int mid = (end-begin)/2;
if(mid == key){
int h = mid-1;
end = &h;
也没有意义,因为变量end将存储局部变量h的地址
如本演示程序所示,该功能可通过以下方式实现
#include <iostream>
#include <iomanip>
bool binary_search( const int *begin, const int *end, int key )
{
if ( begin < end )
{
const int *mid = begin + ( end - begin ) / 2;
if ( *mid < key ) return binary_search( ++mid, end, key );
else if ( key < *mid ) return binary_search( begin, mid, key );
else return true;
}
else
{
return false;
}
}
int main()
{
int a[] = { 1, 3, 5 };
const size_t N = sizeof( a ) / sizeof( *a );
for ( size_t i = 0; i <= a[N-1] + 1; i++ )
{
std::cout << i << " is present in the array - "
<< std::boolalpha << binary_search( a, a + N, i )
<< std::endl;
}
return 0;
}
binary\u搜索(begin,end,key)
调用前面应该有return
。@songyuanyaoend=&h代码>是一个bug-应该是*end=h代码>和*begin=i代码>注意,当代码缩进以匹配逻辑时,值检查代码中名义上缺少一个else
,编译器可能会抱怨,因为该路径上没有返回。当然,这三个先决条件是if(key==mid)
和else if(key
和else if(key>mid)
,它们涵盖了所有情况,但编译器可能会,也可能不会发现第三个测试是多余的。