数据结构实验之查找四:二分查找

数据结构实验之查找四:二分查找

Description

在一个给定的无重复元素的递增序列里,查找与给定关键字相同的元素,若存在则输出找到的位置,不存在输出-1。

Input

一组输入数据,输入数据第一行首先输入两个正整数n ( n < = 10^6 )和m ( m < = 10^4 ),n是数组中数据元素个数,随后连续输入n个正整数,输入的数据保证数列递增。
随后m行输入m个待查找的关键字key

Output

若在给定的序列中能够找到与关键字key相等的元素,则输出位序(序号从0开始),否则输出-1。

Sample

Input

8 3
4 6 8 9 13 20 21 22
6
8
17

Output

1
2
-1
#include <stdio.h>
#include <algorithm>
#include <vector>
//#include <bits/stdc++.h> //用万能头不会超时,但是用cin和cout必超时,关了缓冲区也没用
using namespace std;
const int N = 1e7 + 10;
int a[N];
vector<int> ans;               //使用vector数组记录一下答案,其实用个普通数组就行,只是清空的时候麻烦一点
void find(int i, int j, int n) //可以用while循环控制,也可以直接使用find函数递归
{
    int k = (i + j) / 2;
    if (ans.empty()) //先放一个初始值
    {
        ans.push_back(a[k]);
    }
    while (i <= j) //这是重点
    {
        if (n > a[k])
        {
            if (abs(a[k] - n) < abs(ans[0] - n) && ans.size())
            {
                ans.clear();
                ans.push_back(a[k]);
            }
            else if (abs(a[k] - n) == abs(ans[0] - n) && ans.size() && a[k] != ans[0])
            {
                ans.push_back(a[k]);
            }
            i = (k + 1);
            k = (i + j) / 2;
        }
        else if (n < a[k])
        {
            if (abs(a[k] - n) < abs(ans[0] - n) && ans.size())
            {
                ans.clear();
                ans.push_back(a[k]);
            }
            else if (abs(a[k] - n) == abs(ans[0] - n) && ans.size() && a[k] != ans[0])
            {
                ans.push_back(a[k]);
            }
            j = (k - 1);
            k = (i + j) / 2;
        }
        else if (n == a[k])
        {
            printf("%d\n", n);
            return;
        }
    }
    if (ans.size() > 1)
    {
        i = max(ans[0], ans[1]);
        j = min(ans[0], ans[1]);
        printf("%d %d\n", j, i);
    }
    else
        printf("%d\n", ans[0]);
}
int main()
{
    int n, m, k;
    while (~scanf("%d %d", &n, &m))
    {
        for (int i = 0; i < n; i++)
            scanf("%d", &a[i]);
        sort(a, a + n); // 题目没有提到给的数组是有序的
        while (m--)
        {
            ans.clear();
            scanf("%d", &k);
            find(0, n - 1, k);
        }
        printf("\n"); //组间输出一个空行
    }
    ans.clear();
    return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值