二分查找算法

阅读量: 402 编辑

二分查找的思想就一个:逐渐缩小搜索区间。 如下图所示,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;
}
爱码岛编程公众号
试卷资料
爱码岛编程小程序
在线刷题
苏ICP备13052010号
©2023 南京匠成信息科技有限公司