本专栏持续输出数据结构题目集,欢迎订阅。
题目
请编写程序,实现分块有序的索引表的顺序查找算法。
输入格式:
输入首先给出 2 个正整数,即索引表的规模 m(≤100)和数据块的规模 l(≤100)。随后 m 行,每行给出 l 个数据,为 int 型正整数。每行的数据乱序,但第 i 行所有数据都不超过第 i+1 行的所有数据。
最后一行给出若干正整数,为需要查找的元素,最后以 −1 结尾,这个数字不需要查找。
同行数字间以空格分隔。题目保证顺序表中无重复元素。
输出格式:
在一行中输出每个待查找元素在顺序表中的位序(从 1 开始)。若元素不在表中,则输出 0。为简化输出处理,每个数字后面跟一个空格。
输入样例:
4 5
5 4 3 2 1
6 7 8 9 10
12 13 11 15 14
20 16 18 17 19
1 6 11 10 19 21 -1
输出样例:
5 6 13 10 20 0
代码
#include <stdio.h>
#include <stdlib.h>
int main() {
int m, l;
scanf("%d %d", &m, &l); // m为索引表规模,l为每个数据块的规模
// 存储所有数据
int total = m * l;
int *data = (int *)malloc(total * sizeof(int));
// 存储每个块的最大值,用于索引
int *max_vals = (int *)malloc(m * sizeof(int));
// 读取数据并计算每个块的最大值
for (int i = 0; i < m; i++) {
int max_val = -1;
for (int j = 0; j < l; j++) {
int idx = i * l + j;
scanf("%d", &data[idx]);
if (data[idx] > max_val) {
max_val = data[idx];
}
}
max_vals[i] = max_val;
}
// 处理查找请求
int target;
int is_first = 1; // 控制输出格式
while (1) {
scanf("%d", &target);
if (target == -1) {
break;
}
// 步骤1:确定目标可能所在的块
int block_idx = -1;
for (int i = 0; i < m; i++) {
if (target <= max_vals[i]) {
block_idx = i;
break;
}
}
// 步骤2:在确定的块内顺序查找
int pos = 0; // 默认为0(未找到)
if (block_idx != -1) {
int start = block_idx * l;
int end = start + l;
for (int i = start; i < end; i++) {
if (data[i] == target) {
pos = i + 1; // 位序从1开始
break;
}
}
}
// 输出结果
if (is_first) {
printf("%d", pos);
is_first = 0;
} else {
printf(" %d", pos);
}
}
printf(" ");
return 0;
}
784

被折叠的 条评论
为什么被折叠?



