【二分查找】

Description

给出含有n个数的升序序列,保证序列中的数两两不相等,这n个数编号从1 到n。

Input

单组输入。首先输入一个整数n(1 <= n && n <= 3000000),接下的一行包含n个数。

Output

对于每次询问,输出一个整数代表答案。

Sample Input

5
1 3 5 7 9
3
1
5
8

Sample Output

1

3

-1

 

二分查找又叫折半查找,即在一个有序表中,查找某一关键字。首先记录中间位置的关键字,与查找的关键字比较,若相等则成功,否则利用记录的中间位置将序列分成两个子表,如果中间位置关键字大于查找关键字,则查找大于中间位置的子表,否则查找小于的中间位置的子表。重复以上过程直到找到满足条件的记录,或者子表不存在为止。

优点优点是比较次数少,查找速度快,平均性能好。

缺点其缺点是要求待查表为有序表,且插入删除困难,适用于不经常变动而查找频繁的有序列表。

#include <iostream>

using namespace std;
int a[3000005];
int Binsearch(int a[],int l,int r,int t)
{
    int mid;//中间位置
    if(l>r)return -1;
    mid=(l+r)/2;
    if(a[mid]==t)return mid;
    else if(a[mid]>t)
        return Binsearch(a,l,mid-1,t);
    else
        return Binsearch(a,mid+1,r,t);
}
int main()
{
    int i,n,N;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    cin>>N;
    while(N--)
    {
        int t,k;
        cin>>t;
       k=Binsearch(a,1,n,t);
      cout<<k<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值