您的位置:首页 > 其它

二分查找小结

2014-12-19 12:55 239 查看
先看二分查找的一般写法

#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
;
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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: