数据结构上机实验之二分查找
Time Limit: 1000MS Memory limit: 65536K
题目描述
在一个递增的序列里,查找元素是否存在,若存在输出YES,不存在输出NO.
输入
本题多组数据,首先输入一个数字n,然后输入n个数,数据保证数列递增,然后再输入一个查找数字。
输出
若存在输出YES,不存在输出NO.
示例输入
4 1 3 5 8 3
示例输出
YES
提示
来源
cz
示例程序
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int n, *s; // 数据个数, 数组用动态分配内存
- int left, right, mid;
- int x; // 要查找的数
- int i;
- while (scanf("%d", &n) == 1 && n > 0)
- { // 输入数据个数
- s = (int *)malloc(n*sizeof(int)); // 分配内存
- if (s == NULL)
- exit(0);
- for (i = 0; i < n; i++) // 输入数据
- scanf("%d", &s[i]);
- scanf("%d", &x); // 输入要查找的数
- // 以下查找和输出
- left = 0;
- right = n-1;
- while (left <= right)
- { // 加个等于, 因为有等于的情况
- mid = (left + right)/2;
- if (s[mid] == x)
- {
- printf("YES\n");
- break; // 用break结束循环
- }
- else if (s[mid] < x)
- left = mid + 1;
- else
- right = mid - 1;
- }
- if (left > right) // 加一个判断, 当left大于right时, 说明数不存在数组里面.
- printf("NO\n");
- }
- }
-
#include<stdio.h> int a[10000000]; int main() { int key, n, i; int low, high, mid; while( ~scanf("%d", &n)) { int k=0; low = 1; high = n; for(i=1; i<=n; i++) scanf("%d", &a[i]); scanf("%d", &key); while(low<=high) { mid = (low+high)/2; if(key==a[mid]) { k = mid; break; } else if(key<a[mid]) high = mid -1; else low = mid + 1; } if(k!=0) printf("YES\n"); else printf("NO\n"); } return 0; }