2-4 折半查找
- 分数:10
- 作者:陈越
- 单位:浙江大学
题目描述
请编写程序,实现有序顺序表的折半查找算法。
输入格式
- 输入首先给出一个正整数
n(≤10⁵),表示顺序表的元素个数; - 随后一行按升序给出
n个不超过 10⁸ 的正整数,为顺序表中的元素(题目保证无重复元素); - 最后一行给出若干正整数,为需要查找的元素,最后以
-1结尾(-1不需要查找); - 同行数字间以空格分隔。
输出格式
在一行中输出每个待查找元素在顺序表中的位序(位序从 1 开始):
- 若元素在表中,输出其位序;
- 若元素不在表中,输出
0; - 每个数字后面跟一个空格(包括最后一个输出项)。
输入输出样例
输入样例
9
1 2 3 4 5 6 7 8 9
1 5 4 9 10 -1
输出样例
1 5 4 9 0
代码限制
- 代码长度限制:16 KB
- 时间限制:400 ms
- 内存限制:64 MB
- 栈限制:8192 KB
解析
#include<stdio.h>
#include<stdlib.h>
// 定义一个顺序表
/* ==================================================================*/
#define RATIO 2
typedef int SeqData_t;
typedef struct{
SeqData_t *data;
int len; // 表长
int capacity; // 表容量
}SeqTable;
// 创建一个顺序表
SeqTable *createSeqTable(int n){
if(n <= 0) return NULL;
SeqTable *table = malloc(sizeof(SeqTable)); if(!table) return NULL;
table->data = malloc(sizeof(SeqData_t) * n);
if(!table->data){
free(table);
return NULL;
}
table->len = 0; // 初始化表长
table->capacity = n; // 初始化表容量
return table;
}
void releaseSeqTable(SeqTable *table){
if(table){
if(table->data){
free(table->data);
}
table->len = 0;
table->capacity = 0;
free(table);
}
}
void pushBack(SeqTable *table, SeqData_t data){
if(!table) return;
if(table->len >= table->capacity){
// 扩容
SeqData_t *temp = realloc(table->data, sizeof(SeqData_t) * table->capacity *RATIO);
if(!temp) return;
table->data = temp;
table->capacity *= RATIO;
}
// 插入数据
table->data[table->len] = data;
table->len++; // 表长➕1
}
// 二分查找,未找到或失败返回-1
int binarySearch(SeqTable *seqTable, SeqData_t e){
if(!seqTable) return -1;
int left = 0, right = seqTable->len - 1, mid;
while(left <= right){
mid = left + (right - left) / 2; // 防止溢出
if(seqTable->data[mid] < e){
// 往右边找
left = mid + 1;
}
else if(seqTable->data[mid] > e){
// 往左边找
right = mid - 1;
}
else{
return mid + 1; // 找到了,返回该元素位序
}
}
return -1; // 遍历完顺序表依然未返回说明待查找元素不存在
}
int main(){
int n; scanf("%d", &n);
SeqTable *seqTable = createSeqTable(n);
SeqData_t data; // 暂存输入元素
for(int i = 0; i < n; i++){
scanf("%d", &data);
pushBack(seqTable, data);
}
int pos; // 存待查找元素位序
while(1){
scanf("%d", &data);
if(data == -1) break;
printf("%d ", (pos = binarySearch(seqTable, data)) == -1 ? 0 : pos);
}
releaseSeqTable(seqTable);
return 0;
}
738

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



