二分法(c语言)
一个典型算法
算法:当数据量很大时宜采用此方法。使用前提:使用二分查找时,数据是排好序的。
基本思想:假设数据是升序的,对于给定的n,从序列的中间位置mid开始比较,
如果数组为arr[10],则mid=(0+9)/2; mid 为数组的角标;
如果 当前位置arr[mid]等于n,则查找成功;
若n小于arr[mid],则在数组的前半段查找,arr[left,mid-1];
若n大于arr[mid],则在数组的后半段查找,arr[mid+1,ringht];
然后再重新结算mid的值,比如 n小于arr[mid],则第二次mid =(left+mid-1)/2;
然后再次比较;重复,直到找到n为止,或者找不到。
#include <stdio.h>void EF(int arr[],int sz,int n){ //如果查找到了则输出YES;int left=0;int right=sz-1;while(left<=right){int mid=(left+right)/2;if(n<arr[mid]) right=mid -1;else if(n>arr[mid]) left=mid+1;else {printf("YES\n");break;}}if(left>right) printf("NO\n"); //没查找到,跳出循环,输出NO;
}
int main()
{int n,m; int i,j; scanf("%d %d",&n,&m);int arr[n];int arr2[m];for(i=0;i<n;i++){scanf("%d",&arr[i]);}for(i=0;i<m;i++){scanf("%d",&arr2[i]);EF(arr,n,arr2[i]);}return 0;
}