【二分法搜索——C++】

原理:

二分法搜索是一种基于分治策略的查找算法,采用了在有序列表中搜索目标值的技术。这种算法在排序的数组中进行查找,每次将查找区域减半,直到找到目标值或者确定目标值不存在。这种算法的时间复杂度为 O(log n)。

以下是一个使用C++实现二分法搜索的示例代码,其中 arr 是一个按升序排列的数组,n 表示数组的长度,key 是需要查找的值:

#include <iostream>
using namespace std;

int binarySearch(int arr[], int n, int key) {
    int left = 0, right = n-1;
    while (left <= right) {
        int mid = left + (right - left) / 2; // 计算中间值
        if (arr[mid] == key)
            return mid; // 找到了目标值,返回下标
        else if (arr[mid] < key)
            left = mid + 1; // 目标值在右侧,更新左边界
        else
            right = mid - 1; // 目标值在左侧,更新右边界
    }
    return -1; // 没有找到目标值
}

int main() {
    int arr[] = {1, 3, 5, 7, 9};
    int n = sizeof(arr) / sizeof(arr[0]);
    int key = 5;
    int index = binarySearch(arr, n, key);
    if (index != -1) {
        cout << "Found at index " << index << "\n";
    } else {
        cout << "Not Found\n";
    }
    return 0;
}

在这个示例程序中,我们在 main 函数中声明了一个长度为 5 的整型数组,它包含了一些有序的整数。

我们使用 sizeof 运算符和数组元素大小来计算数组的长度,然后声明一个 key 变量,其中包含我们要在数组中查找的目标值。我们将 key 值传递给 binarySearch 函数进行查找。

如果找到该元素,则输出“Found at index”和该元素的索引,否则输出“Not Found”。返回值0表示程序正常完成。

当我们使用二分法搜索算法时,我们在一个有序(升序或者降序)的列表中进行查找。该算法的主要思想是将列表不断地分成两半,然后判断中间元素是否是我们正在查找的元素。如果是,则算法完成,返回该元素的下标。如果不是,我们将两部分列表之一丢弃,并重复这个过程,直到我们找到该目标元素或者确定该元素不存在于列表中。

以下是二分法搜索的详细步骤:

  1. 初始化左右指针:在开始之前,我们要求列表按升序或者降序排列,并初始化两个指针指向列表的两端。在 C++ 中,可以使用 int 型变量分别表示两端:left 和 right。

  2. 查找中间元素:我们需要计算出列表中间元素的位置_middle,可以通过计算 (left + right) / 2 (或left+(right-left) / 2)或使用位运算符 (left + right) >> 1 来实现。

  3. 比较目标元素和中间元素:如果目标元素等于中间元素,则我们可以退出程序并返回中间元素的下标。如果目标元素小于中间元素,则我们需要丢弃大于中间元素的那部分列表,并继续查找第一部分列表。如果目标元素大于中间元素,我们需要丢弃小于中间元素的那部分,并继续查找第二部分列表。

  4. 更新左右指针:接下来,我们需要更新左右指针。如果我们正在查找的元素在左半部分,则将 left 指针更新为 middle+1。否则,如果目标元素在右半部分,则我们将更新right指针为middle-1。

  5. 重复步骤2到4,直到找到目标值或者确定它不存在于列表中为止。

  6. 返回结果:最后,如果找到了目标值,则返回目标值在列表中的下标。否则,返回-1表明它不在列表中。

总的来说,二分法搜索算法是一种非常快速且高效的方法,用于在有序的列表中查找元素。该算法的关键在于将列表分成两半,然后丢弃我们不再查找的那部分。这就意味着,我们每次操作会将目标范围减半,因此,该算法的时间复杂度为O(log n)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值