二分查找的迭代实现:
int binary(int a[],int x,int y,int v)
{
int m;
while(x<y)
{
m=(x+y)/2;
if(a[m]==v)
return m;
else if(a[m]>v)
y=m;
else
x=m+1;
}
return -1;
}
二分查找求下界
int lower_bound(int a[],int x,int y,int v)
{
int m;
while(x<y)
{
m=(x+y)/2;
if(a[m]>=v)
y=m;
else
x=m+1;
}
return x;
}
二分查找求上界
int upper_bound(int a[],int x,int y,int v)
{
int m;
while(x<y)
{
m=(x+y)/2;
if(a[m]<=v)
x=m+1;
else
y=m;
}
return y;
}
用c++写程序的时候可以直接使用头文件
#include<algorithm>//STL算法的头文件,包含sort,lower_bound和upper_bound
using namespace std;
eg:给出n个整数Xi 和m个询问,对于每个询问(a,b),输出闭区间[a,b]内的整数xi的个数
#include<cstdio>
#include<algorithm>
using namespace std;
int v[10000];
int main()
{
int n,m,a,b;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
sort(v,v+n);
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
printf("%d\n",upper_bound(v,v+n,b)-lower_bound(v,v+n,a));
}
return 0;
}