二分搜索算法采用迭代和递归

binary search algorithms using iterative and recursive

本文关键字:迭代 递归 搜索算法 二分      更新时间:2023-10-16

我正在寻找一个排序数组中的元素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;
}

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

递归函数的工作原理与其他函数完全相同——如果它声明返回一个值,它就必须返回一个值。它不只是自动返回终止递归调用的结果。

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

你的编译器应该警告你——如果没有,打开更多的警告。
如果你不在乎,那就开始听警告吧。

下面的函数有问题:

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];

如果没有从返回函数的某些代码路径返回,则该代码行为是未定义的。

作为旁注

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