二分搜索算法采用迭代和递归
binary search algorithms using iterative and recursive
我正在寻找一个排序数组中的元素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
机制。
相关文章:
- TSP递归解的迭代形式
- 此递归函数的每次迭代的值存储在哪里?
- 在迭代模板类型列表时无法停止递归
- 如何使用迭代器在 c++ 中的递归函数中传递值?
- 将多个非原始递归调用转换为迭代解决方案
- 迭代 /递归
- 通过提升属性树(递归方式)发出 YAML 迭代
- 树不维护递归迭代器成员
- 使用迭代器对向量的C 递归初始化产生不一致的结果
- 如何将递归函数(具有两个基本情况)转换为迭代函数
- 将递归函数转换为迭代函数
- 从递归算法到迭代算法
- Union-Find方法性能,迭代与递归
- 递归到迭代而不重新绑定引用
- C++ 递归可迭代访问
- 递归可迭代模板函数 C++
- 为什么后缀失败并且前缀在传递迭代器作为参数并在尾部位置递归时工作正常
- C 递归代码迭代
- 从预序遍历迭代(不是递归)构造二叉搜索树
- 以迭代方式编写递归代码