【分治法】两分查找

问题描述:

已知一个数组为升序,给定一个值,在此数组中查找是否存在,是则返回下标,否则提示“not found”.

解1:思维上最先想到的是顺序查找,即线性查找,对数组做遍历;思维上简单,然其耗时较长。这个的时间复杂度为cita(n);

解2:两分查找:类似于查字典,过程如下:

  1.  确定查找范围后,定义binary=n/2;
  2. 若x等于a[binary],返回binary,结束;
  3. 若x小于a[binary],就去前面部分查找,回到第一步;
  4. 若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);较之方法一,在大的数据下有明显优势。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值