我正在用C ++实现二进制搜索。这是我的代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int bs(vector<int> a, int val)
{
int l =0, r = a.size()-1;
while(l<=r) // Significance of ==
{
int mid = l + (r-l)/2;
if(a[mid]==val) return mid;
if(a[mid]>val)
{
r = mid-1; continue;
}
else
{
l = mid + 1 ;
}
}
return l; // Deliberately returning this
}
int main()
{
vector<int> a = {1,3};
cout << bs(a,1) <<endl;
return 0;
}
问题1
在某些实现中,我看到人们使用
while(l<r)
而在某些人中他们使用
while(l<=r)
偏好一种方式之间是否有任何概念上的区别?如果我不使用==?
,任何可能的错误来源问题2
如果找不到元素,是否可以保证元素可以插入的位置,以便列表仍然保持排序?使用等于或不等于?
时这是否有效答案 0 :(得分:0)
这取决于您如何计算变量r
。
在你的情况下
r = a.size()-1;
正确用法是while(l<=r)
如果您将r计算为r = a.size();
正确用量为while(l<r)
如果找不到元素,则保证为该位置 其中可以插入元素,以便列表仍然存在 排序?
您没有对矢量进行排序,为了进行正确的二分查找,应在调用二进制搜索之前对矢量进行排序。
std::sort(std::begin(a),std::end(a));
标头提供std::binary_search
,所以改为重新发明轮子你可以按如下方式使用它:
std::binary_search(std::begin(a),std::end(a),val);
二进制搜索应该返回向量中的索引值,如果找到的话。但是不能保证它应该提供下一个插入位置。
使用等于或不等于?
时这是否有效
我在答案的第一部分对此进行了解释。