DS静态查找之顺序索引查找
题目描述
给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始
要求使用顺序索引查找算法,其中索引表查找和块内查找都采用不带哨兵、从头开始的顺序查找方法。
输入
第一行输入n,表示主表有n个数据
第二行输入n个数据,都是正整数,用空格隔开
第三行输入k,表示主表划分为k个块,k也是索引表的长度
第四行输入k个数据,表示索引表中每个块的最大值
第五行输入t,表示有t个要查找的数值
第六行起,输入t个数值,输入t行
输出
每行输出一个要查找的数值在队列的位置和查找次数,数据之间用短划线隔开,如果查找不成功,输出字符串error
输入样例:
18
22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 57 86 53
3
22 48 86
6
13
5
48
40
53
90
输出样例:
3-4
error
12-8
error
18-9
error
参考代码:
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
struct num {
int max, start, end;
};
int main() {
int n, k;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
cin >> k;
vector<num> ans;
int a = 0, b = 0, c = 0;
for (int i = 0; i < k; i++) {
cin >> a;
b = c;
for (int j = 0; j < n; ++j) {
if (v[j] > a) {
c = j - 1;
break;
}
}
if (i == 0)
ans.push_back({a, 0, c});
else if (i == k - 1)
ans.push_back({a, b, n - 1});
else
ans.push_back({a, b, c});
c++;
}
int t;
cin >> t;
while (t--) {
int x, sum = 0, flag = 0;
cin >> x;
for (auto &an: ans) {
sum++;
if (x <= an.max) {
for (int j = an.start; j <= an.end; ++j) {
sum++;
if (x == v[j]) {
flag = 1;
cout << j + 1 << '-' << sum << endl;
break;
}
}
break;
}
}
if (flag == 0)
cout << "error" << endl;
}
return 0;
}