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
。@songyuanyao
end=&h是一个bug-应该是
*end=h
*begin=i注意,当代码缩进以匹配逻辑时,值检查代码中名义上缺少一个
else
,编译器可能会抱怨,因为该路径上没有
返回。当然,这三个先决条件是
if(key==mid)
else if(key
else if(key>mid)
,它们涵盖了所有情况,但编译器可能会,也可能不会发现第三个测试是多余的。