题目描述:
在有序序列中查找某一元素x。
输入:
首先输入一个正整数n(n<=100000),表示该序列有n个整数,然后按从小到大的顺序输入n个整数;
接着是一个正整数m,表示有m次查找;
最后是m个整数,表示m个要查找的整数x。
输出:
对于每一次查找,有一行输出。若序列中存在要查找的元素x,则输出元素x在序列中的序号(序号从0开始);若序列中不存在要查找的元素x,则输出"Not found!"。
样例输入 :
5 1 3 5 7 9 11 -1 1 2 3 4 5 6 7 8 9 10
样例输出 :
Not found! 0 Not found! 1 Not found! 2 Not found! 3 Not found! 4 Not found!
问题分析:
我们是在区间内查找每次将要查找元素与区间中间的元素比较,如果相等则输出中间元素的下标值,不相等则重新确定区间然后再比较中间元素与要查找元素的值直到不满足循环条件的值或找到目标元素。
区间确定定义一个区间的左端点left与右端点right,在开始时查找的是整个区间所以对left赋初值为0,对right赋初值为n-1,因为我们要查找的区间是闭区间所以对与查找循环的条件应为left小于等于right,在循环里找出中间元素middle让其与查找的元素c比较当num[middle]<c时可以确定c在num[middle]右边,因为num[middle]已经判定过所以再次确定区间时区间的左端点left=middle+1,右端点不变;当num[middle]>c时可以确定c在num[middle]左边,因为num[middle]已经判定过所以再次确定区间时区间的左端点right=middle-1,左端点不变;当num[middle]=c时说明已经找到了,此时输出num[middle]的下标值middle同时跳出循环,查找循环外面需要设置一个条件来判定是否查找完了却没找到,条件是left>right,当条件成立时说明在其中没有要查找的元素。如图:
代码实现:
#include<stdio.h>
int main() {
int n, m;
int num[100000], c;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%d", &c);
int left = 0;
int right = n - 1;
int middle;
while (left <= right) {
middle = (left + right) / 2;
if (num[middle] > c) {
right = middle - 1;
}
else if (num[middle] < c) {
left = middle + 1;
}
else {
printf("%d\n", middle);
break;
}
}
if (left > right) {
printf("Not found!\n");
}
}
return 0;
}
运行结果:
提交结果: