Description
给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始
要求使用顺序索引查找算法,其中索引表查找和块内查找都采用不带哨兵、从头开始的顺序查找方法。
Input
第一行输入n,表示主表有n个数据
第二行输入n个数据,都是正整数,用空格隔开
第三行输入k,表示主表划分为k个块,k也是索引表的长度
第四行输入k个数据,表示索引表中每个块的最大值
第五行输入t,表示有t个要查找的数值
第六行起,输入t个数值,输入t行
Output
每行输出一个要查找的数值在队列的位置和查找次数,数据之间用短划线隔开,如果查找不成功,输出字符串error
Sample
Input
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
Output
3-4 error 12-8 error 18-9 error
AC代码
#include<iostream>
using namespace std;
class Lnode //定义索引表类
{
public:
int max; //最大关键字域
int first; //块第一元素下标域
};
void lookfirst(int n, int* a, Lnode* L, int k)//给first赋值
{
L[0].first = 1;
for (int i = 1; i < k ; i++)
{
for (int j = 0; j < n; j++)
{
if (a[j] > L[i - 1].max)
{
L[i].first = j + 1;
break;
}
}
}
}
int sumtime(int key, int* a, int n, int k, Lnode* L)
{
int time = 0;
for (int i = 0; i < k; i++)
{
time++;
if (key > L[k - 1].max)
{
return -1;
}
if (key <= L[i].max)
{
for (int j = L[i].first - 1;; j++)
{
time++;
if (a[j] > L[i].max) //块内不存在相等的
{
return -1;
}
if (key == a[j])
{
return time;
}
}
}
}
}
int main()
{
int n;
int t;
int key;
while (cin >> n)
{
int* arry = new int[n];
for (int i = 0; i < n; i++)
{
cin >> arry[i];
}
int k;
cin >> k;
Lnode* L = new Lnode[k];
for (int j = 0; j < k; j++)
{
cin >> L[j].max;
}
lookfirst(n, arry, L, k);
cin >> t;
while (t--)
{
cin >> key;
int d = 1;
int time = sumtime(key, arry, n, k, L);
if (time != -1)
{
for (int i = 0; i < k; i++)
{
if (key <= L[i].max)
{
for (int p = L[i].first - 1;; p++)
{
if (key == arry[p])
{
d = p;
break;
}
}
break;
}
}
cout << d + 1 << "-" << time << endl;
}
else
{
cout << "error" << endl;
}
}
}
return 0;
}