折半查找详解

一:折半查找概念

        折半查找(也称为二分查找)是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束;如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样在那一半的中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

二:折半查找的步骤

  1. 前提条件:数组必须是有序的。

  2. 确定搜索范围:初始化搜索范围的左边界 left 为数组的第一个元素索引,右边界 right 为数组的最后一个元素索引。

  3. 计算中间位置:计算中间位置 mid,通常使用 (left + right) / 2 的方式,为了避免整数溢出,也可以写作 left + (right - left) / 2

  4. 比较中间元素:将目标值 target 与中间位置 mid 对应的元素进行比较。

    • 如果相等,则搜索成功,返回 mid
    • 如果目标值小于中间元素,则更新右边界 right = mid - 1,在左半部分继续查找。
    • 如果目标值大于中间元素,则更新左边界 left = mid + 1,在右半部分继续查找。
  5. 循环搜索:重复步骤 3 和 4,直到找到目标值或者搜索范围为空(即 left > right)。

  6. 搜索失败:如果搜索范围为空,则目标值不在数组中,返回 -1 或其他表示未找到的值。

三.折半查找案例分析

例如:在数组array = {4, 5, 6, 7, 9, 12, 18, 23}中查找9,其代码实现如下

public class BinarySearch {
    // 声明一个静态变量来记录比较次数
    public static int comparisonCount = 0;
    public static int binarySearch(int[] array, int target) {
        if (array == null || array.length == 0) {
            comparisonCount = 0; // 数组为空,设置比较次数为0
            return -1; // 数组为空,返回-1表示未找到
        }

        int left = 0;
        int right = array.length - 1;

        while (left <= right) {
            comparisonCount++; // 每次比较时增加计数
            int mid = left + (right - left) / 2; // 防止溢出
            if (array[mid] == target) {
                return mid; // 找到目标,返回其索引
            } else if (array[mid] < target) {
                left = mid + 1; // 在右半部分继续查找
            } else {
                right = mid - 1; // 在左半部分继续查找
            }
        }

        return -1; // 没有找到目标,返回-1
    }

    public static void main(String[] args) {
        int[] array = {4, 5, 6, 7, 9, 12, 18, 23};
        int target = 9;
        int result = binarySearch(array, target);
        if (result != -1) {
            System.out.println("元素 " + target + " 在数组中的索引为: " + result + "  查找的次数:" +comparisonCount);
        } else {
            System.out.println("元素 " + target + " 不在数组中" + "查找的次数" +comparisonCount);
        }
    }

 结果如下:

四:折半查找的图解

五:折半查找的时间复杂度

        折半查找的时间复杂度为 O(log n),可以考虑哈希表等其他数据结构提高效率

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git 用户名密码Clone代码

#密码中包含&#xff0c;则使用%40代表 cd /disk03/wwwroot/GitDemo/BuildTemp && git clone -b dev --single-branch http://root:test%40123192.168.31.104/root/SaaS.Auto.Api.git git pull origin dev 今天使用LibGit2Sharp在Linux上Clone代码时报错&#xff0c;因…

新能源汽车 LabCar 测试系统方案(二)

什么是LabCar测试 LabCar测试目标是进行整车黄板台架功能测试&#xff0c;用于整车开发和测试阶段&#xff0c;满足设计人员和测试人员的试验需求&#xff0c;以验证整车性能&#xff0c;减少开发工作量。系统主要用于测试静态及动态工况下的纯电动汽车的各项功能实现情况。 …

使用StarWind软件做P2V转换

近期有个项目要将一个老的Win7还有XP 32位版本转换为虚拟机。先后用了StarWind&#xff0c;Vmwared的vcenter conerter&#xff0c;还有disk2vhd软件工具。本文介绍下StarWind的使用和一些优势。 其实转换过程很简单&#xff0c;难度是转换以后的虚机无法正常启动。对于虚机的…

云服务器安装部署LAMP网站Web环境教程

搭建网站如何安装LAMP环境&#xff0c;以腾讯云轻量应用服务器为例&#xff0c;应用模板直接选择“LAMP”镜像即可&#xff0c;打开腾讯云轻量应用服务器页面&#xff0c;在应用模板中选择LAMP即可&#xff0c;如下图&#xff1a; 轻量服务器“LAMP”镜像 腾讯云的LAMP应用镜像…

性能评测系列:云架构扩展演进横向对比

原始测评报告 性能评测系列&#xff08;PT-010&#xff09;&#xff1a;Spring Boot RDS for MySQL&#xff0c;高并发insert 性能评测系列&#xff08;PT-012&#xff09;&#xff1a;Spring Boot(K8s多实例) RDS for MySQL&#xff0c;高并发insert 性能评测系列&#xff…

智能黄历运势API:用科学解读你的命运

黄历是一种能同时显示公历、农历和干支历等多套历法&#xff0c;并附加大量与趋吉避凶相关的规则和内容的历书。在中国传统文化中&#xff0c;人们相信黄历可以预测吉凶祸福&#xff0c;指导人们的日常生活。 现在&#xff0c;有了智能黄历运势API&#xff0c;我们可以通过科学…

AI 助力的在线 Excel 表格:真正的革命还是市场噱头?

在当今数字化和自动化的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术被广泛应用于各种领域&#xff0c;从智能手机到工业生产&#xff0c;无所不在。最近&#xff0c;一些产品声称通过AI技术来增强传统的办公软件&#xff0c;如在线Excel表格。例如&#xff0c;Cha…

昇思MindSpore学习笔记7--函数式自动微分

摘要&#xff1a; 介绍了昇思MindSpore神经网络训练反向传播算法中函数式自动微分的使用方法和步骤。包括构造计算函数和神经网络、grad获得微分函数&#xff0c;以及如何处理停止渐变、获取辅助数据等内容。 一、概念要点 神经网络训练主要使用反向传播算法&#xff1a; 准备…

5个大气的wordpress付费主题

Sesko赛斯科wordpress外贸主题 适合用于重型机械设备公司建外贸官方网站的橙红色wordpress外贸主题。 https://www.jianzhanpress.com/?p5886 Polar钋啦wordpress外贸主题 制造业wordpress网站模板&#xff0c;适合生产制造企业官方网站使用的wordpress外贸主题。 https:/…

【CV炼丹师勇闯力扣训练营 Day22:§7 回溯1】

CV炼丹师勇闯力扣训练营 代码随想录算法训练营第22天 回溯法其实就是暴力查找,回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割…

weiyang**3.控制台01

1. 搭建单群组FISCO BCOS联盟链 使用开发部署工具 build_chain.sh脚本在本地搭建一条4 节点的FISCO BCOS链&#xff0c;以Ubuntu 22.04 64bit系统为例操作。 1.1 安装依赖 sudo apt install -y openssl curl 1.2 创建操作目录, 下载安装脚本 ## 创建操作目录 cd ~ &&a…

YOLO系列笔记(十八)—— YOLOv1和YOLOv2总结与对比

YOLOv1和的v2总结与对比 YOLOv1主要思想算法架构主干网络损失函数 训练过程网络预测主要成果优化方向 YOLOv2算法架构主干网络损失函数 相较之前的优化添加Batch Normalization引入锚框&#xff08;Anchor Boxes&#xff09;机制引入DarkNet-9多尺度输入训练 网络训练第一阶段&…

单片机学习(16)--直流电机驱动

直流电机驱动 15.1直流电机驱动基础知识1.直流电机介绍2.电机驱动电路3.PWM介绍 15.2LED呼吸灯和直流电机调速1.LED呼吸灯代码2.直流电机调速&#xff08;1&#xff09;产生PWM的方法&#xff08;2&#xff09;工程目录&#xff08;3&#xff09;main.c函数 15.1直流电机驱动基…

kaggel-汽车价格预测项目

1.读取数据&#xff0c;查看数据基本概况 import pandas as pd datapd.read_csv(r./car_price_prediction.csv)#查看前5行数据 print(data.head(5))output:ID Price Levy ... Wheel Color Airbags 0 45654403 13328 1399 ... Left wheel Silve…

css 滚动词云

css javascript 实现滚动词云效果 // 163css.js var radius 120; var dtr Math.PI / 180; var d 300; var mcList []; var active false; var lasta 1; var lastb 1; var distr true; var tspeed 10; var size 250; var mouseX 0; var mouseY 0; var howElliptic…

宝塔安装rabbitMQ实战

服务器环境说明 阿里云服务器、宝塔、centos7 一、下载erlang 原因&#xff1a;RabbitMQ服务端代码是使用并发式语言Erlang编写的&#xff0c;安装Rabbit MQ的前提是安装Erlang。 下载地址&#xff1a;http://www.erlang.org/downloads 下载对应的版本&…

进程间通信简介-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

进程间通信简介 进程间通信简介 进程间进程简称IPC(interprocess communication)&#xff0c;进程间通信就是在不同进程之间传递信息或交换信息 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的…

互联网算法备案 | 填报指南

一、填报入口 登陆互联网信息服务算法备案系统&#xff08;以下简称备案系统&#xff09;进行填报&#xff0c;网址为https://beian.cac.gov.cn。系统首页如图1所示。 图1备案系统首页&#xff08;示意图&#xff09; 二、填报流程 填报人员需首先注册并登陆备案系统&#x…

用Roofline模型去分析pytorch和Triton算子

用Roofline模型去分析pytorch和Triton算子 1.参考链接2.测试环境3.安装相关依赖4.锁频5.获取理论算力6.创建测试脚本7.运行测试程序生成Roofline图8.NVIDIA Nsight Compute生成Roofline9.效果图A.nn.LinearB.Triton实现 本文演示了如何用Roofline模型去分析pytorch和Triton算子…

探秘 NTHU-DDD:疲劳与哈欠背后的驾驶安全密码(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 一、引言…