二叉搜索不适用于 n = 1, 2
Binary search not working for n = 1, 2
这是我的二进制搜索代码,n = no of elements in array
// Binary Search
// BUG: not working for n = 2
#include <iostream>
int main() {
const int n = 1;
int newlist[n];
std::cout << "Enter " << n;
std::cout << " elements in increasing order:n";
for( int i = 0; i < n; ++i ) {
std::cin >> newlist[i];
}
int pos = 0, num;
std::cout << "Enter number:n";
std::cin >> num;
std::cout << 'n';
int imin = 0, imax = n-1;
int imid = (n - 1)/2;
for( int i = 0; i < n; ++i ) {
imid = (imin + imax) / 2;
if( newlist[imid] == num ) {
pos = imid;
}
else if( newlist[imid] < num ) {
imin = imid+1;
}
else {
imax = imid-1;
}
}
if( pos != 0 ) {
std::cout << "Found at " << pos+1;
}
else {
std::cout << "Not found!n";
}
return 0;
}
它确实适用于n > 2
,但无法为n <= 2
提供正确的输出,即即使对于找到的元素也给出了Not found!
输出。
我认为一种方法是为n <= 2
单独实现,但这会变得很麻烦!请帮忙。
将 pos 运算符设置为 -1 而不是 0。 0 表示您的第一个索引,并且由于您输出的元素尚未找到 pos == 0 条件,因此您的代码失败。您应该最初将 pos 设置为 -1,并检查其自身是否存在未找到条件,如果在 pos = 0 处找到元素,则意味着该元素存在于第一个索引处。
第一个pos
等于0
是正确的值。因此,在开头将pos
设置为-1
,并在检查是否找到时与-1
(或更常见的>= 0
)进行比较。
其次,应该更改的项目很少,因为现在没有那么多的二进制搜索:
- 没有理由在循环之前初始化
mid
,它只是临时变量,作用域在循环块中。 - 退出搜索的条件是
min > max
,您不需要任何额外的计数器,因为即使该值不存在,它也总是会运行循环n
次。所以改为while (min <= max) { ...
- 最后但并非最不重要的一点是,找到该项后,立即通过
break
语句退出循环。
我不认为for循环是这里的控制结构,因为当你找到正确的项目或imin和imax是无意义的时,你想完成。
在给定的实现中,您甚至不会在找到项目时停止循环,而只需确认找到的项目"n-(找到项目的迭代次数)"次。
此外,由于数组和向量C++都是从 0 开始的,将位置 == 0 作为"未找到"的标记是一个坏主意;你可以改用 http://en.cppreference.com/w/cpp/types/numeric_limits 或 n 中的项目(因为索引从 0 到 n-1)。
从理论上讲,您可以使用指针算法使您的数组基于 1,我假设您没有;我不会推荐它。但是,您的代码截取缺少列表的实际定义。
相关文章:
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字
- 选择排序C++(已修改)并非适用于所有情况
- 无法让"std::enable_if"适用于无作用域枚举
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 确定夏令时是否适用于特定日期
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- QT 样式表主题,适用于使用属性选择器的整个应用程序
- C++带有适用于左值和右值的引用参数的函数
- 代码适用于调试,但不适用于发布
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- 适用于大型数组的无复制线程安全环形缓冲区
- NRVO 是否也适用于协程?
- 约束包容是否仅适用于概念?
- 程序只适用于包含(无副作用)cout声明
- 适用于频繁更改的大型数据集的最佳数据结构
- 相同的 for 循环适用于其他项目,但不适用于此项目。为什么?
- C++:二叉搜索树适用于整数,但当我尝试传递字符串时崩溃
- 递归呼吸优先搜索适用于第一次执行,但不适用于随后的执行