算法03 二分查找算法【C++实现】

二分查找的概念

二分查找又称为折半查找,主要用于查找一个有序数组中某一个数的位置。

主要思想如下:

在一个有序数组中,取数组的中间值与要查找的数进行比较;

若要查找的数等于中间值,查找成功。

二分查找的步骤

若要查找的数大于中间值,则在右半区间继续取中间值与要查找的数进行比较;

若要查找的数小于中间值,则在左半区间继续取中间值与要查找的数进行比较;

直至最后要查找的数未出现过与中间值相等的情况,查找失败。

举例说明

比如我们要在下面这个有序数组中通过二分查找下标3(key)的值,有两个指针(low和high)分别指向第一个值和最后一个值,求出mid【(low+high)/2】

此时a[mid]>key成立,取左区间,此时high应该移到mid前面位置

此时a[mid]>key成立,取左区间,此时high应该移到mid前面位置

此时a[mid]==key成立,返回mid的值,接下来我们看下程序怎么写。

二分查找模板

使用自定义函数的方法,需要引入的三个参数分别是整个数组,数组长度,查找值。返回的是查找值在数组中的位置。

int Search(int a[],int n,int key){int low = 1;//左边界从1开始int high = n;//右边界从n开始while(low <= high) {int mid = low + ((high-low)/2); //中间下标if(key == a[mid])     //相等代表找到return mid;else if(key < a[mid])  //比中间小,把右边界缩小high = mid - 1;else                  //比中间大,把左边界缩小low = mid + 1;}return -1;//如果都找不到
}

二分查找的优势

二分查找因为每次查找都会把这个数据折半,所以效率相对较高。如果使用普通的查找可能会消耗太多的时间。

大家可以试试看,在1-100之间随便设定一个数字,只需要最多最多7次肯定能猜对,每次问的都是这个数字和范围中间的数字比大小,每次比完都能去掉一半的数字。

训练:找某个数的位置

在有序数组中查找某个数,找到返回数的下标,不存在重复的值,没有返回-1。

【输入描述】第一行两个整数空格分开,分别表示序列长度n以及查询次数m。

第二行输入n个整数

接下来m行,每行一个整数,表示查询的数字。

【输出描述】输出m行,每行为查询数字的位置(位置从1开始算)。

【样例输入】

3 3
4 6 9
9
4
7

【样例输出】

3
1
-1

参考代码

#include<iostream>
using namespace std;
int Search(int a[] , int n, int key){int low = 1;int high = n;while(low <= high) {int mid = low + ((high-low)/2);if(key == a[mid])   return mid;else if(key < a[mid])high = mid - 1;else low = mid + 1;}return -1;
}
int main()
{int s[100000],n,m,b;cin>>n>>m;for(int i=1;i<=n;i++)cin>>s[i];for(int i=1;i<=m;i++){cin>>b;cout<<Search(s,n,b)<<endl;}return 0;
}

思考

最后希望大家再回顾思考这么几个问题:

  • 二分查找基本思路是什么?
  • 二分查找怎么找某一个不重复数字的位置?
  • 怎么知道一个数字重复出现多少次?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js安装扫盲

一、Node.js安装 在官网下载node.js安装包 双击打开node-v20.14.0-x64.ms文件&#xff0c;点击运行 进入安装Node.js的对话框&#xff0c;点击Next继续 勾选复选框后点击Next继续 默认安装路径 默认配置 这里不需要勾选&#xff0c;直接点击Next 点击Install 二、Node.js验…

【安装和引入 PyTorch 包,快来收藏】

在本文介绍 PyTorch 中一些最常用的命令和设置。 一个完成的 PyTorch 工作流程。 安装和引入 PyTorch 包 最好的安装教程就是去官方网站&#xff1a;https://pytorch.org/get-started/locally/ 安装结束之后&#xff0c;直接引入整个 torch 包&#xff1a; import torch或…

SQL注入-上篇

SQL注入 注入是web安全的头号大敌。注入攻击漏洞往往是应用程序缺少对输入进行安全性检查所引起的。攻击者把一些包含攻击代码当做命令或者查询语句发送给解释器&#xff0c;这些恶意数据可以欺骗解释器&#xff0c;从而执行计划外的命令或者未授权访问数据。注入漏洞通常能sq…

MySQL约束详解:构建数据完整性基石

目录 MySQL约束1.1 约束1.1 数据类型1.2 主键约束[重要]1.3 自增约束1.4 唯一约束1.5 非空约束1.6 默认值代码演示 1.7 外键约束[了解]思维导图最后 MySQL约束 MySQL作为广泛使用的开源关系型数据库管理系统&#xff0c;其强大的数据约束功能对于维护数据的一致性和准确性至关…

4.类,方法,对象

1.1.2. 面向对象程序设计的三大特征 1.1.2.1. 封装 面向对象编程核心思想之一就是将数据和对数据的操作封装在一起&#xff0c;形成一般的概念&#xff0c;比如类的概念。 1.1.2.2. 继承 继承体现了一种先进的编程模式。子类可以继承父类的属性和方法。 1.1.2.3. 多态 多…

Day 44 Ansible自动化运维

Ansible自动化运维 几种常用运维工具比较 ​ Puppet ​ —基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱ruby ​ SaltStack ​ —基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YAML,使得配置脚本更简单 ​ Ansible ​ —基于 …

Python学习笔记12:进阶篇(一),类的相关知识

前言 在讲类之前&#xff0c;我们简单介绍一些Python的知识。这些知识在入门篇没讲&#xff0c;想学Python的&#xff0c;基本都对Python有基础的了解&#xff0c;但是今天开始的进阶知识&#xff0c;会涉及到一些Python的特性&#xff0c;所以在这里介绍一下。 Python是一种高…

Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )

上期链接&#xff1a;Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)-CSDN博客 上期我们聊了人物的受伤和死亡的逻辑和动画&#xff0c;我们主要学习了事件的执行&#xff0c;即我们在人物受伤时可能会触发很多的事件&#xff0c;比如触发人物受伤的动画以及播放音乐等…

LabVIEW电表改装与校准仿真系统

LabVIEW开发的电表改装与校准仿真实验平台不仅简化了传统的物理实验流程&#xff0c;而且通过虚拟仿真提高了实验的效率和安全性。该平台通过模拟电表改装与校准的各个步骤&#xff0c;允许学生在没有实际硬件的情况下完成实验&#xff0c;有效地结合了理论学习和实践操作。 项…

计算机组成原理(三)

文章目录 只读存储器和闪速存储器ROM 只读存储器光擦可编程只读存储器(EPROM) 闪速存储器 并行存储器双端口存储器多模块交叉存储器定量分析 相联存储器 只读存储器和闪速存储器 ROM 只读存储器 ROM ,只能读出不能写入&#xff0c;最大的优点是不易失性。 光擦可编程只读存储器…

Spring Security+Spring Boot实现登录认证以及权限认证

基本概念 “Authentication(认证)”是spring security框架中最重要的功能之一&#xff0c;所谓认证&#xff0c;就是对当前访问系统的用户给予一个合法的身份标识&#xff0c;用户只有通过认证才可以进入系统&#xff0c;在物理世界里&#xff0c;有点类似于“拿工卡刷门禁”的…

homework 2024.06.17 math, UI

A的宽度225 B的宽度150 这样画出来就比较标准&#xff0c; 225 * 2 150 * 3 2A 3B

【排序算法】希尔排序详解(C语言)

文章目录 前言希尔排序的原理原理思路 代码实现希尔排序的相关问题效率算法稳定性 前言 为什么会有希尔排序&#xff0c;要从插入排序说起&#xff0c;希尔排序一开始设计出来是为了改进插入排序&#xff0c;因为插入排序在处理大量数据时效率不高&#xff0c;特别是对于近乎有…

【MySQL】MySQL数据库基础|数据库的操作|常用数据类型|表的操作

目录 一、数据库的操作&#xff08;针对“数据集合”的操作&#xff09; 1.显示当前的数据库 2.创建数据库 3.使用数据库 4.删除数据库 二、常用数据类型 1.数值类型 2.字符串类型 3.日期类型 三、表的操作 1.列出当前数据库的表 2.创建表 3.查看表结构 4.删除表…

11.5.k8s中pod的调度-cordon,drain,delete

目录 一、概念 二、使用 1.cordon 停止调度 1.1.停止调度 1.2.解除恢复 2.drain 驱逐节点 2.1.驱逐节点 2.2.参数介绍 2.3.解除恢复 3.delete 删除节点 一、概念 cordon节点&#xff0c;drain驱逐节点&#xff0c;delete 节点&#xff0c;在对k8s集群节点执行维护&am…

CesiumJS【Basic】- #006 浏览器控制台查看位置角度

文章目录 浏览器控制台查看位置角度1 目标 浏览器控制台查看位置角度 1 目标 浏览器控制台查看位置角度

KVB:怎么样选择最优交易周期?

摘要 在金融交易中&#xff0c;周期的选择是影响交易成败的重要因素之一。不同的交易周期对应不同的市场环境和交易策略&#xff0c;选择合适的周期可以提高交易的成功率。本文将详细探讨交易中如何选择最优周期&#xff0c;包括短周期、中周期和长周期的特点及适用情况&#…

软考系统规划与管理师伴读脑图第9章

周末发系统规划与管理师的试听视频&#xff0c;占用了发送次数&#xff0c;所以上周的脑图推迟了今天发出。 不知不觉已经发到了第9章&#xff0c;感叹这就是坚持积累下来的力量&#xff0c;其实考试也是一样的道理。

Git--Part3--远程操作 配置 标签管理

theme: nico 远程仓库 Git 是分布式版本控制系统&#xff0c;同⼀个 Git 仓库&#xff0c;可以分布到不同的机器上。怎么分布呢&#xff1f; 最早&#xff0c;肯定只有⼀台机器有⼀个原始版本库&#xff0c;此后&#xff0c;别的机器可以 “克隆” 这个原始版本库&#xff0…

AI导航网

文章目录 1、[AI导航网](https://www.ainav.cn/) 1、AI导航网 https://www.ainav.cn/