假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,然后缩小区间重复操作,直到找到为止。
#include<iostream>
using namespace std;
int main ()
{
int a[1000];
int l,r,mid,x;
for(int i=0;i<1000;i++)
scanf("%d",&a[i]);//输入1000个已经排好序的元素 //据说scanf比cin省时间
cin>>x;//x为要查找的数字
l=0;r=999;mid=(l+r)/2;//l为起始下标,r为末尾下标,mid为中间下标 ,此时mid将这1000个元素分为两个区间
while(l<r&&a[mid]!=x)
{
if(a[mid]<x)l=mid+1;
else r=mid-1;
mid=l+(r-l)/2;//更新区间 ,利用循环一直缩小区间,知道找到结果,或者区间长度为1,退出循环
}
if(a[mid]==x)
cout<<"找到了,在第"<<mid<<"项里"<<endl;
else
cout<<"没找到"<<endl;
return 0;
}
注:按照这个方法,a[mid]一定是有值的,所以最后需要来通过比较判断这个数列到地有没有要找的那个x值;