题目描述:
输入数组长度 n
输入数组 a[1...n]
输入查找个数m
输入查找数字b[1...m]
输出 YES or NO 查找有则YES 否则NO 。
输入:
输入有多组数据。
每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m<=n<=100)。
输出:
如果在n个数组中输出YES否则输出NO。
样例输入: 5
1 5 2 4 3
3
2 5 6
样例输出: YES
YES
输入数组长度 n
输入数组 a[1...n]
输入查找个数m
输入查找数字b[1...m]
输出 YES or NO 查找有则YES 否则NO 。
输入:
输入有多组数据。
每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m<=n<=100)。
输出:
如果在n个数组中输出YES否则输出NO。
样例输入: 5
1 5 2 4 3
3
2 5 6
样例输出: YES
YES
NO
算法实现;
/* 二分查找 */
int cmp(const void *a,const void *b);//qsort函数比较函数参数
int find(int a[],int l,int r,int x);// 二分查找函数
#include<stdio.h>
#include<stdlib.h>
int main(){
int n,m,*a,*b,i;
freopen("test.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
a=(int *)malloc((n+1)*sizeof(int));
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
qsort(a,n,sizeof(int),cmp);//先对数组进行排序!!!
scanf("%d",&m);
b=(int *)malloc((m+1)*sizeof(int));
for(i=1;i<=m;i++){
scanf("%d",&b[i]);
if(find(a,1,n,b[i])){
printf("YES\n");
}
else
printf("NO\n");
}
free(a);
}
fclose(stdin);
return 0;
}
int cmp(const void *a,const void *b){
return *(int *)a-*(int *)b;
}
int find(int a[],int l,int r,int x){//二分查找函数
if(l>r) return 0;
else{
int m=(l+r)/2;
if(x>a[m])
return find(a,m+1,r,x);
else if(x<a[m])
return find(a,l,m-1,x);
else
return m;
}
}
1.二分排序的前提是待排序列有序,因此,应该首先对 原数组进行排序;
2.二分排序的程序 要注意 查找失败的情况;
3.特别的输出格式技巧:每个输出数字以空格间隔,设置一bool量,判断是否为第一次输出,对于不是第一次输出的数字以空格+数字输出即可,如1126打印极值点下标。