问题描述:
已知一个数组为升序,给定一个值,在此数组中查找是否存在,是则返回下标,否则提示“not found”.
解1:思维上最先想到的是顺序查找,即线性查找,对数组做遍历;思维上简单,然其耗时较长。这个的时间复杂度为cita(n);
解2:两分查找:类似于查字典,过程如下:
- 确定查找范围后,定义binary=n/2;
- 若x等于a[binary],返回binary,结束;
- 若x小于a[binary],就去前面部分查找,回到第一步;
- 若x大于a[binary], 就到后面部分查找,返回第一步。
关键在于如何用分治法做循环,循环到什么时候停止(找到的条件、找不到的条件);
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int searchBy(int data[],int n,int x)
{
int low=0;
int high=n-1;
int binary=(low+high)/2;
while(x!=data[binary]&&low<=high) //循环的条件就是x不等于中间数且低位置小于高位置
{
if(x<data[binary])
high=binary-1;
else
low=binary+1;
binary=(high+low)/2;
}
if(low<=high)
return binary;
else
return -1;
}
int main ()
{
int n;
int a[10]={9,19,29,39,49,59,69,79,89,99};
cout<<"please input a number:"<<endl;
cin>>n;
int i=searchBy(a,10,n);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
if(i==-1)
cout<<"Not found!"<<endl;
else
cout<<"founded at "<<i+1<<endl;
}
这种两分查找的时间复杂度为 T(n)=cita(lgn);较之方法一,在大的数据下有明显优势。