【发布时间】:2016-08-03 14:51:12
【问题描述】:
#include <iostream>
using namespace std;
int bsearch(int x, int lo, int hi, int a[])
{
if(lo <= hi) {
int mid = lo + (hi - lo)/2;
if(x == a[mid]) {
cout<<mid<<endl;
return mid;
} else if(x < a[mid]) {
hi = mid - 1;
bsearch(x, lo, hi, a);
} else {
lo = mid + 1;
bsearch(x, lo, hi, a);
}
}
return -1;
}
main()
{
int a[5] = {12, 13, 15, 18, 20};
cout << bsearch(20, 0, 4, a);
}
以上是C++中二分查找的实现。我编写了一个函数来执行二进制搜索,该函数将排序数组作为输入。在主函数内部,我将一个排序整数数组作为参数传递给函数。当我搜索不位于数组末端的元素时,该程序似乎工作正常,但为极端元素提供了错误的输出。为了找出错误,我在函数体中包含了一个“cout”语句来打印“mid”的值。令人惊讶的是,即使在数组极端元素的情况下,mid 的值也被正确计算,但是对于极端元素,程序的输出仍然是错误的。谁能指出它有什么问题?
【问题讨论】:
-
你应该做一些更多调试。逐步检查整个过程,找出哪个计算出错了。
-
你对
bsearch进行所有这些递归调用,然后丢弃它们的结果。顶级呼叫(来自main的呼叫)然后落入return -1;。两次递归调用应该是return bsearch(...); -
你应该在递归调用中放置一个
return:return bsearch(x, lo, hi, a);
标签: c++ binary-search