二分查找
图片来源于王道机试课程
代码
#include <cstdio>
#include <algorithm>
using namespace std;
int arr[100];//全局的数组,方便在不同的函数间共享
bool binarySearch(int n, int x){
//查到了返回true
//查不到返回false
int left = 0;
int right = n-1;
while (left <= right){//最容易出错的地方
int mid = (left + right)/2;
if (arr[mid] == x){
return true;
} else if (arr[mid] > x){
right = mid - 1;//右边往左边缩
//最后的边界情况 right和left相等,下次right可能会变成left-1
} else{
left = mid + 1;
}
}
return false;
}
int main() {
int n,m;
while (scanf("%d", &n) != EOF){
for (int i = 0; i < n; ++i) {
scanf("%d", &arr[i]);
}
// 排序
sort(arr,arr+n);
// 读取m个数据
scanf("%d", &m);
for (int i = 0; i < m; ++i) {
int x;
scanf("%d", &x);
if (binarySearch(n,x)){
printf("YES\n");
} else{
printf("NO\n");
}
}
}
return 0;
}