2016.10.28
【题目描述】
1001.二分查找
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
给定一个单调递增的整数序列,问某个整数是否在序列中。
输入
第一行为一个整数n,表示序列中整数的个数;第二行为n(n不超过10000)个整数;第三行为一个整数m(m不超过50000),表示查询的个数;接下来m行每行一个整数k。
输出
每个查询的输出占一行,如果k在序列中,输出Yes,否则输出No。
输入样例
5
1 3 4 7 11
3
3
6
9
输出样例
Yes
No
No
【解题思路】
二分查找,条件是序列必须有序,然后设置左右边界,每次比较中间值与目标值的大小,以确定左右边界。时间复杂度O(logn)
【代码实现】
#include <stdio.h>
void binary_search(int [], int ,int );
int main(void)
{
int i, n, m, key;
int a[10005];
scanf("%d", &n);
for (i = 1; i <= n; ++i)
scanf("%d", &a[i]);
scanf("%d", &m);
while (m--)
{
scanf("%d", &key);
binary_search(a, n, key);
}
return 0;
}
void binary_search(int a[], int n, int key)
{
int l, r, mid;
int flag = 0;
l = 1;
r = n;
while (l <= r)
{
mid = (l + r) >> 1;
if (a[mid] == key)
{
flag = 1;
break;
}
else if (a[mid] < key)
l = mid + 1;
else
r = mid - 1;
}
if (flag)
printf("Yes\n");
else
printf("No\n");
}
【心得体会】