使用const指针进行二进制搜索

时间:2016-07-16 14:08:46

标签: c++ arrays binary-search

我们应该实现一个使用二进制搜索来检查数组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;
    }
}

但它不会提供任何输出,但它会给我错误。

warning: control reaches end of non-void function [-Wreturn-type]

我真的不明白我在这里要做什么,所以有人可以解释我这里出了什么问题吗?

2 个答案:

答案 0 :(得分:1)

如果是这些if else语句

module.exports = function composedCall(args, cb){

  var pending = 0;
  var results = [];
  var calledBack = false;

  callback1(args,handleResult());
  callback2(args,handleResult());
  callback3(args,handleResult());

  function handleResult(){
    var order = pending;
    pending ++;
    return function(err, result){
      pending --;
      if(err){
        callback(err);
      }else{
        results[order] = result;
        if(!pending){
          callback(null, results);
        }
      }
    }
  }
  function callback(err, value){
    if(! calledBack){
      calledBack = true;
      cb(err, value)
    }
  }
}


function callback1(args ,callback){
  setTimeout(callback, randomTimeout(), null, 1);
}

function callback2(args ,callback){
  setTimeout(callback, randomTimeout(), null, 2);
}
function callback3(args ,callback){
  setTimeout(callback, randomTimeout(), null, 3);
}

//utils
function randomTimeout(){
  return Math.floor(Math.random() * 1e3);
}

function randomValue(){
  return Math.floor(Math.random() * 1e10);
}

该函数不返回任何内容。这就是这些代码块没有return语句。

此外,该功能没有意义,因为例如在这些陈述中

}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);
}

将键与数组的索引进行比较,而不是将键与索引为mid的数组中的元素值进行比较。

或者这些陈述

int mid = (end-begin)/2;
if(mid == key){

也没有意义,因为变量end将存储局部变量h的地址。

该功能可以按照以下方式实施,如本演示程序所示。

    int h = mid-1;
    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;
}

答案 1 :(得分:0)

您应该在所有可能的分支中return

更改

binary_search(begin, end, key);

return binary_search(begin, end, key);

返回递归调用的结果。