C++ 二分法

news/2024/11/8 21:34:58 标签: 算法, 数据结构

二分法(Binary Search)是一种常用的查找算法,它通过将已排序的元素划分为两部分,然后通过比较目标值与划分点的大小关系,将查找范围缩小一半,从而快速地找到目标值。二分法的时间复杂度为O(logN),很适合用于查找大规模数据中的目标值。在本篇博文中,我将介绍二分法的基本原理、C++代码实现以及一些实际应用,希望能够帮助大家更好地理解和应用这个算法

目录:
1. 二分法的基本原理
2. C++代码实现
3. 二分法的应用实例
4. 总结

📚 1. 二分法的基本原理

二分法的基本原理可以概括为以下几个步骤:
1) 将已排序的数组或列表的首位索引分别记为low和high。
2) 取中间位置mid的索引,并取出对应的元素midValue。
3) 将目标值与midValue进行比较:
   - 如果目标值等于midValue,查找成功,返回mid。
   - 如果目标值小于midValue,说明目标值可能在左侧,将high更新为mid - 1,然后重复步骤2。
   - 如果目标值大于midValue,说明目标值可能在右侧,将low更新为mid + 1,然后重复步骤2。
4) 当low大于high时,查找失败,返回-1。

🖥️ 2. C++代码实现

下面是用C++语言实现二分法的代码示例:

#include <iostream>
#include <vector>

using namespace std;

int binarySearch(vector<int>& nums, int target) {
    int low = 0;
    int high = nums.size() - 1;
    
    while (low <= high) {
        int mid = low + (high - low) / 2;
        
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    
    return -1;
}

int main() {
    vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int target = 6;
    int index = binarySearch(nums, target);
    
    if (index != -1) {
        cout << "目标值在数组中的索引为:" << index << endl;
    } else {
        cout << "目标值不存在于数组中。" << endl;
    }
    
    return 0;
}

以上代码首先定义了一个名为binarySearch的函数,接受一个已排序的数组nums和目标值target作为参数,返回目标值在数组中的索引。函数内部使用了一个while循环来进行二分查找,通过不断更新low和high来缩小查找范围,直到找到目标值或者查找失败。

在main函数中,我们定义了一个测试用例nums和目标值target,并调用了binarySearch函数进行查找。结果会输出目标值在数组中的索引或者提示目标值不存在于数组中。

💡 3. 二分法的应用实例

二分法广泛应用于各种数据查找和优化问题中。下面是几个常见的应用实例:

- 查找数组中的目标元素:二分法可以高效地在已排序的数组中查找目标元素,时间复杂度为O(logN)。
- 旋转数组的查找:将已排序的数组按照某个索引旋转后,仍然可以使用二分法来查找目标元素。
- 查找数组中的峰值元素:峰值元素指的是大于其相邻元素的元素,二分法可以用来找到数组中的一个峰值元素。
- 查找有序矩阵中的目标元素:将有序矩阵视为一个已排序的二维数组,可以使用二分法在其中查找目标元素。

🔍 4. 总结

二分法是一种高效的查找算法,通过将已排序的元素划分为两部分,能够快速地定位目标元素。本篇博文介绍了二分法的基本原理、C++代码实现以及一些实际应用实例。希望对大家了解和应用二分法有所帮助。

如果对二分法还有疑问或者想了解更多相关内容,欢迎留言讨论!🎉


http://www.niftyadmin.cn/n/5744461.html

相关文章

精华 springBoot快速上手

快速搭建springboot项目 项目包结构 SpringBoot_Project src //java程序源代码 main entity //实体类 mapper //mapper映射类接口 service //service层接口和实现类 controller //controller层接口 resources //资源文件夹 mappers //mapper映射文件 public //存放.html等网页…

Java SPI机制简单讲解

前言 在Java开发中&#xff0c;经常会遇到需要扩展系统功能的需求。为了使系统更加灵活和可扩展&#xff0c;Java提供了SPI&#xff08;Service Provider Interface&#xff09;机制。本文将简单介绍SPI机制的基本概念、工作原理&#xff0c;并通过一个具体的示例来展示如何使…

Nginx配置文件详解及常用功能配置、应用场景

一、Nginx配置文件结构 Nginx的配置文件通常命名为nginx.conf&#xff0c;其结构清晰&#xff0c;遵循简单的层次化设计&#xff0c;主要分为以下几个部分&#xff1a; 全局块&#xff1a; user&#xff1a;指定Nginx工作进程运行的用户和用户组。 worker_processes&#xf…

SCI期刊文章录用后,期刊被on hold了怎么办?

主要有以下两种选择&#xff1a; 递一&#xff0c;如果时间紧张&#xff0c;可以撤稿重投。比如说等着文章发表了好去申请项目、毕业啥的&#xff0c;那可得好好考虑下撤稿重投这条路哦。为啥呢&#xff1f; 因为 on hold 期间&#xff0c;数据库是会暂停检索该期刊新发表的文…

回溯算法详解与剪枝优化

1. 什么是回溯算法&#xff1f; 回溯算法&#xff08;Backtracking&#xff09;是一种通过探索所有可能情况来找到所有解的算法。它在一定程度上可以理解为带有返回操作的深度优先搜索(DFS)。 1.1 基本思想 从一个初始状态出发按照规则向前搜索当搜索到某一状态无法继续前进…

如何开发查找附近地点的微信小程序

我开发的是找附近卫生间的小程序。 在现代城市生活中&#xff0c;找到一个干净、方便的公共卫生间有时可能是一个挑战。为了解决这个问题&#xff0c;我们可以开发一款微信小程序&#xff0c;帮助用户快速找到附近的卫生间。本文将介绍如何开发这样一款小程序&#xff0c;包…

redis:zset有序集合命令和内部编码

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令ZADDZRANGEZREVRANGEZCARDZCOUNTZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY集合间操作…

网络规划设计师-(13)物理层

什么是物理层&#xff1f; 物理层是计算机网络中的一层&#xff0c;负责在物理媒介上传输数据比特流。它主要关注如何将比特流转换为电信号、光信号、无线信号等物理形式&#xff0c;以便能够在传输媒介上传输。物理层还负责确定物理连接的方式、传输速率、编码方式、电压等。物…