数据结构实验之查找四:二分查找
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;
}