使用迭代和递归的二进制搜索算法

时间:2014-06-03 09:30:39

标签: c++ arrays binary-search

我在排序数组中寻找元素x。它比较xx或数组范围等于零我得到分段错误我出错了我无法找到我的代码如下 我正在编译gcc编译器。

#include <iostream>
using namespace std;

// iterative
int bsearch(int a[], int sz, int x)
{
  int low = 0;
  int high = sz -1;

  while(low <= high) {
    int mid = (low+high)/2;

    if(x < a[mid]) 
      high = mid - 1;
    else if(x > a[mid]) 
      low = mid + 1;
    else 
      return a[mid];
  }
  return -1;
}

// recursive
int bsearch_recursive(int a[], int low, int high, int x)
{
  if(low > high) return -1;

  int mid = (low + high)/2;

  if(x < a[mid])
    bsearch_recursive(a, low, mid-1, x);
  else if(x > a[mid])
    bsearch_recursive(a, mid+1, high, x);
  else
    return a[mid];
}

void print(int n)
{
  if(n == -1) {
    cout << "not found" << endl;
  return;
  }
  cout << "found" << endl;

}
int main()
{        
  int a[]={3, 7, 9, 16, 23, 34, 67, 87, 92};
  int arraySize = sizeof(a)/sizeof(int);
  int result;

  result = bsearch(a, arraySize, 7); 
  print(result);
  result = bsearch(a, arraySize, 92); 
  print(result);
  result = bsearch(a, arraySize, 77); 
  print(result);

  result = bsearch_recursive(a, 0, arraySize-1, 7); 
  print(result);
  result = bsearch_recursive(a, 0, arraySize-1, 92); 
  print(result);
  result = bsearch_recursive(a, 0, arraySize-1, 77); 
  print(result);

  return 0;
}

2 个答案:

答案 0 :(得分:4)

您的递归搜索需要在每条路径上都有 返回值 ,否则其结果是未定义的。

递归函数的工作方式与其他函数完全相同 - 如果它声称要返回一个值,它必须这样做。它不仅会自动返回终止递归调用的结果。

int bsearch_recursive(int a[], int low, int high, int x)
{
    if(low > high) return -1;

    int mid = (low + high)/2;
    if(x < a[mid])
        return bsearch_recursive(a, low, mid-1, x);
    else if(x > a[mid])
        return bsearch_recursive(a, mid+1, high, x);
    else
        return a[mid];
}

您的编译器应该已经警告过您 - 如果没有,请打开更多警告 如果确实如此并且您不在乎,请开始听警告。

答案 1 :(得分:3)

下面的功能有问题:

int bsearch_recursive(int a[], int low, int high, int x)

当你递归调用这个函数时,你应该 返回值 ,如下所示

int mid = (low + high)/2;
if(x < a[mid])
  return bsearch_recursive(a, low, mid-1, x);  // added return
else if(x > a[mid])
  return bsearch_recursive(a, mid+1, high, x);  // added return
else
  return a[mid];

如果您没有从返回的函数的某些代码路径返回,则代码行为为undefined

作为附注

  • 如果您打算将此代码用于非常大的数组,(low + high)可能会溢出,请使用
int mid = low + (high - low)/2;
  • 要确保您的编译器使用-Wall向您发出有关此编译的警告 选项。
  • 如果数组可能包含正数和负数,则在出现错误时返回-1不是一个好主意。如果找到则返回数组索引,如果错误或设备有其他-1机制,则可以返回not found