当前位置: 首页 > news >正文

查找算法-二分查找(折半查找)

二分查找(Binary Search)算法是一种在有序数组中查找特定元素的搜索算法。它通过不断将数组分成两半,判断目标值可能存在的区间,从而缩小搜索范围,直到找到目标值或搜索范围为空。二分查找的时间复杂度为O(log n),其中n是数组的长度。

以下是二分查找算法的关键知识点和Java实现示例:

知识点

  1. 前提条件:数组必须是有序的。
  2. 基本思想:通过比较数组中间元素与目标值的大小,判断目标值可能存在的区间,然后继续在可能存在目标值的区间内查找,直到找到目标值或区间为空。
  3. 边界处理:在每次迭代中,需要正确更新查找区间的边界(即左边界left和右边界right)。
  4. 循环条件:循环继续的条件是左边界小于等于右边界,即left <= right
  5. 返回结果:如果找到目标值,则返回其索引;如果遍历完整个可能区间仍未找到目标值,则返回特定值(如-1)表示未找到。

Java实现示例

public class BinarySearch {  /**  * 二分查找算法  * @param arr 有序数组  * @param target 要查找的目标值  * @return 目标值在数组中的索引,如果未找到则返回-1  */  public static int binarySearch(int[] arr, int target) {  int left = 0; // 查找区间的左边界  int right = arr.length - 1; // 查找区间的右边界  while (left <= right) {  int mid = left + (right - left) / 2; // 防止溢出,计算中间索引  if (arr[mid] == target) {  return mid; // 找到目标值,返回其索引  } else if (arr[mid] < target) {  left = mid + 1; // 目标值在右半部分,更新左边界  } else {  right = mid - 1; // 目标值在左半部分,更新右边界  }  }  return -1; // 未找到目标值,返回-1  }  public static void main(String[] args) {  int[] arr = {-1, 0, 3, 5, 9, 12};  int target = 9;  int result = binarySearch(arr, target);  if (result != -1) {  System.out.println("找到目标值,位置为:" + result);  } else {  System.out.println("未找到目标值");  }  }  
}

在这个示例中,binarySearch方法实现了二分查找算法。它接受一个有序数组arr和一个目标值target作为参数,并返回目标值在数组中的索引。如果未找到目标值,则返回-1。main方法创建了一个有序数组和一个目标值,并调用了binarySearch方法来查找目标值,最后打印出查找结果。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《Unity3D高级编程 主程手记》第四章 用户界面(二) UGUI 系统的原理及其组件使用
  • 简化mybatis @Select IN条件的编写
  • Android monkey命令和monkey脚本详解
  • vim gcc
  • 【MQTT协议与IoT通信】MQTT协议的使用和管理
  • 追问试面试系列:开篇
  • HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(九)
  • 【React】useState:状态管理的基石
  • 【BUG】已解决:ERROR: No matching distribution found for PIL
  • 《GPT-4o mini:开启开发与创新的新纪元》
  • Python酷库之旅-第三方库Pandas(050)
  • 数据传输安全--SSL VPN
  • 音视频入门基础:PCM专题(3)——使用Audacity工具分析PCM音频文件
  • 微信小程序 async-validator 表单验证 第三方包
  • MySQL第一阶段:多表查询、事务
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Angular Elements 及其运作原理
  • github从入门到放弃(1)
  • Gradle 5.0 正式版发布
  • Java读取Properties文件的六种方法
  • k8s如何管理Pod
  • magento2项目上线注意事项
  • mongo索引构建
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python学习之路13-记分
  • TCP拥塞控制
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • elasticsearch-head插件安装
  • Mac 上flink的安装与启动
  • 关于Android全面屏虚拟导航栏的适配总结
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #、%和$符号在OGNL表达式中经常出现
  • #Z2294. 打印树的直径
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 5种线程安全集合
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .sh
  • /etc/fstab 只读无法修改的解决办法
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [.NET]桃源网络硬盘 v7.4
  • []FET-430SIM508 研究日志 11.3.31
  • [8] CUDA之向量点乘和矩阵乘法
  • [AIGC] Redis基础命令集详细介绍
  • [BFS广搜]迷阵