P2249 【深基13.例1】查找
【首先是对二分法的讲解】
本题是一道非常简单的二分查找题。下面首先展示二分法的代码:
int find(int x)//二分查找
{
int l=1,r=n; //l存数组最左边的下标,r存最右边下标
while(l<r) //当l和r相遇时推出循环
{
int mid=(l+r)/2; //判断最中间的数与要找的数的大小
if(a[mid]>=x) r=mid; //如果大就让r移动到中间
else l=mid+1; //如果小就让l移动到mid前一个
}
if(a[r]==x) return r;
else return -1;
}
注意!!!上面代码需要满足的条件是a[]数组必须是升序(递增)排序的!!
如果数组是降序(递减)排序的话则需要对while循环内部进行一些变动:
while(l<r)
{
int mid = (l+r+1)/2; //下取整
if(a[mid] >= x) l = mid;
else r = mid - 1;
}
下面是本题的参考代码:
#include<stdio.h>
int n,m,q,a[1000005];//全局变量
int find(int x)//二分查找
{
int l=1,r=n;
while(l<r)
{
int mid=(l+r)/2;
if(a[mid]>=x) r=mid;
else l=mid+1;
}
if(a[r]==x) return r;
else return -1;
}
int main ()
{
int i;
scanf("%d %d",&n,&m);//读入
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<m;i++)
{
scanf("%d",&q);
int ans=find(q);
printf("%d ",ans);
}
return 0;
}