/*
二分查找
普通版 bs();
求下界 low_bs();
求上界 up_bs();
*/
#include <cstdio>
#include <algorithm>
using namespace std;
//[l,r)
int bs(int *T,int l,int r,int v)
{
int m;
while(l<r)
{
m = l +(r - l) / 2; //注意 >>1 要加括号
if(T[m] == v) return m;
if(T[m] < v) l = m+1;
else r = m;
}
return -1; //-1表示未找到
}
//寻找值为v的第一个下标l
//代表从[l,r)中寻找下界所在的区间[l,r]
int low_bs(int *T,int l,int r,int v)
{
int m;
while(l<r)
{
m = l + (r-l) / 2;
if(T[m] >= v)
r = m;
else
l = m+1;
}
return l;
}
//返回等于v最后一个元素后面的一个下标r
int up_bs(int *T,int l,int r,int v)
{
int m;
while(l<r)
{
m = l + (r - l) / 2;
if(T[m] <= v)
{
l = m + 1;
}
else
{
r = m;
}
}
}
int a[100];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int v;
scanf("%d",&v);
sort(a,a+n); //DONT FORGET!!
printf("该元素的某个位置为%d\n",bs(a,0,n,v));
printf("该元素所在区间为[%d,%d]",low_bs(a,0,n,v),up_bs(a,0,n,v)-1) ;
//STL
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
scanf("%d",&v);
printf("lower_bound = %d\nupper_bound = %d\n",lower_bound(a,a+n,v) - a,upper_bound(a,a+n,v) - a);
return 0;
}
参考刘汝佳<入门经典>