二分查找是C语言中效率非常高的查找方式
二分查找必须建立在数据已经顺序排列过的基础上
算法的核心思想在于将要查找的数据于序列的中间位置的数据进行比较,如果相等,则表示查找成功,否则将以该位置为基准所要查找的序列分为左右两部分。接下来根据所要查找序列的升降序规律及中间元素与所查找的大小关系,来选择所要查找元素可能存在的那部分序列,对其采用相同的方法进行查找,直至能够确定所要查找的元素是否存在。
例
找数
输入n个按升序排列的整数,m次询问,每次询问一个整数X,请输出数组中X第一次出现的下标,如果不存在则输出-1。
题目保证输入的整数在16位int范围内.
输入格式:
第一行输入n和m(1<=n<=1000000,1<=m<=100000)
第二行输入用空格分隔的n个整数
第三行输入用空格分隔的m次询问的X
输出格式:
在一行中输出m个用空格分隔的整数,行末有换行但无多余空格,每个整数表示询问的答案
输入样例:
9 6
1 1 2 2 3 4 5 5 5
1 2 3 4 5 6
结尾无空行
输出样例:
0 2 4 5 6 -1
结尾无空行
#include<stdio.h>
#include<iostream>
using namespace std;
long long int sore[1000000],check[100000],flag[100000];
int main()
{
int N,M,k=0,v,x;
int head,end,mid;
cin>>N;
cin>>M;
for(int i=0;i<N;i++)
{
cin>>sore[i];
}
for(int i=0;i<M;i++)
{
cin>>check[i];
}
for(int i=0;i<M;i++)
{
k=0;
v=0;
head=0;
end=N;
while(head<=end)
{
mid=(head+end)/2;
if(check[i]<sore[mid])
{
end=mid-1;
}
else if(check[i]>sore[mid])
{
head=mid+1;
}
else
{
if(sore[mid-1]!=sore[mid]&&mid!=0)
{
v=1;
break;
}
else if(mid==0)
{
v=1;
break;
}
else
{
k=1;
end=end-1;
}
}
}
if(v==1)
{
flag[i]=mid;
}
else
{
flag[i]=-1;
}
}
for(int i=0;i<M;i++)
{
cout<<flag[i];
if(i==M-1)
cout<<endl;
else
cout<<' ';
}
return 0;
}