先看二分查找的一般写法
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
using namespace std;
#define N 100005
#define ll __int64
int n,a[N];
int findd(int x)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid]==x)
return mid;
if(a[mid]>x)
r=mid-1;
else
l=mid+1;
}
return -1; //没有找到
}
int main()
{
int i,m,x,t;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
scanf("%d",&m);
while(m--)
{
scanf("%d",&x);
t=findd(x);
printf("%d\n",t);
}
}
return 0;
}
一般的二分查找只能找到目标值,但是当目标值重复出现时返回的下标就不确定,下面的写法可以返回最先出现的目标值的下标。当目标值未出现时,返回比目标值大的那个元素的下标或者返回边界值n;
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
using namespace std;
#define N 100005
#define ll __int64
int n,a[N];
int findd(int x)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid]>=x)
r=mid-1;
else
l=mid+1;
/*if(a[mid]<x) //这种写法也上面同样效果
l=mid+1;
else
r=mid-1;*/
}
return l; //返回目标值的下标,若有多个值相同,返回最先出现的下标。
}
int main()
{
int i,m,x,t;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
scanf("%d",&m);
while(m--)
{
scanf("%d",&x);
t=findd(x);
printf("%d\n",t);
}
}
return 0;
}