1173 二分查找

题目描述: 
输入数组长度 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打印极值点下标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值