二分查找的思想就一个:逐渐缩小搜索区间。 如下图所示,left 和 right 向中间走,直到直到它们重合在一起。
二分查找算法(Binary Search)是一种在有序数组中查找目标元素的高效算法。以下是其基本思想和实现:
-
1、首先,确定查找范围的左右边界,通常为数组的起始和结束位置。
-
2、计算中间元素的索引,将其与目标元素进行比较。
-
3、如果中间元素等于目标元素,查找成功,返回索引。
-
4、如果中间元素大于目标元素,说明目标元素可能在左半部分,将右边界移动到中间元素的左侧。
-
5、如果中间元素小于目标元素,说明目标元素可能在右半部分,将左边界移动到中间元素的右侧。
-
6、重复步骤2-5,直到找到目标元素或者左边界超过右边界,表示查找失败。
【题目描述】
给出 n 个不相同的正整数 a1,a2,a3,.... ,an,其中 n ≤ 10000,ai ≤ 109。
有 m 个查询,m ≤ 10000,每次查询 x 是否在数组中,存在输出 "Yes" ,否则输出 "No" 。
【输入样例】
8
7 13 4 5 8 1 11 9
2
13
15
【输出样例】
Yes
No
【参考程序】
//爱码岛编程
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10005;
int arr[MAXN];
// 二分查找算法
int binarySearch(int arr[], int n, int target) {
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2; // 取中心时靠近左端点
if (arr[mid] == target) {
return mid;
} else if (arr[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
int main() {
int n;
cin >> n;
// 7 13 4 5 8 1 11 9
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
// 先排序
sort(arr, arr + n); // 1 4 5 7 8 9 11 13
int m;
cin >> m;
while (m--) {
int x;
cin >> x;
if (binarySearch(arr, n, x) == -1) {
cout << "No" << endl;
} else {
cout << "Yes" << endl;
}
}
return 0;
}