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

Java算法:二分查找

一、 二分查找注意

        前提是数组必须是有序的,否则无法正常工作。如果数组不是有序的,需要先对数组进行排序,然后才能使用二分查找算法。

二、二分查找高效算法

    二分查找也称为折半查找,是一种在有序数组中查找目标元素的算法。它的原理是不断将查找范围减半,直到找到目标元素或确定目标元素不存在。

     在一个有序数组中查找特定元素时,二分查找是一种高效的算法。它的时间复杂度为 O(log n),相较于线性查找的 O(n),二分查找可以显著提高搜索效率。

三、二分查找步骤

初始化左边界 left 为数组第一个元素的索引,右边界 right 为数组最后一个元素的索引。
计算中间元素的索引 mid=(left + right) / 2。
比较中间元素与目标元素:
        如果中间元素=目标元素,则找到目标,返回中间元素的索引。
        如果中间元素>目标元素,则将右边界更新为 mid - 1,继续在左半边查找。
        如果中间元素<目标元素,则将左边界更新为 mid + 1,继续在右半边查找。

四、 Java 实现二分查找

    //测试数据public static void main(String[] args) {Scanner sc=new Scanner(System.in);List<Integer> list = getList();System.out.println(list);while(true) {System.out.print("输入查找的数字:");int find_num = sc.nextInt();Integer num = search(list, find_num);System.out.println(num);}}/*** (2)二分查找法:* @param list* @param number* @return*/private static Integer search(List<Integer> list, int number) {//左边位置int low = 0;//右边位置int high = list.size() - 1;//循环while (low <= high) {//中间元素int mid = (low + high) / 2;//获取中间元素int guess = list.get(mid);//判断if (guess == number) { //找到这个元素return mid;} else if (guess > number) { //中间元素大于输入的目标数据,继续在left半边查找high = mid - 1;} else {  //中间元素小于输入的目标数据,继续在right半边查找low = mid + 1;}}return -1;  //找不到元素,则返回-1}/*** (1) 有序列表数据20个随机生成*/private static List<Integer> getList() {//过滤重复的数据Set<Integer> sets = new HashSet<>();Random random = new Random();while (true) {//生成1-50的随机数int ran = random.nextInt(50) + 1;//添加sets.add(ran);//判断生成20个数据if (sets.size() >= 20) {break;}}//集合数据List<Integer> list = new ArrayList<>(sets);//升序排序Collections.sort(list);return list;}

效果:

优点和缺点

       二分查找算法的主要优点是其时间复杂度为O(log n),因此对于大型数组的查找操作非常高效。此外,由于二分查找是基于数组的有序性进行查找的,因此可以应用于静态数据集合中的查找操作。

      二分查找也存在一些明显的缺点。首先,二分查找只适用于有序数组,因此如果需要在无序的数据集中查找元素,则需要事先对数据进行排序。其次,二分查找不适用于动态数据结构,因为在插入或删除元素后,会破坏数组的有序性,需要重新排序才能再次使用二分查找

 

相关文章:

  • MPLAB X IDE 仿真打断点提示已中断的断点?
  • 十年JAVA搬砖路——Linux搭建Ldap服务器。
  • GaussDB SQL基础语法示例-数组表达式
  • 【Jenkins】新建任务FAQ
  • 软考高项-49个项目管理过程输入、输出和工具技术表
  • 使用treq库下载Python程序
  • 批量采集各类自媒体平台内容为word文档带图片软件【支持18家自媒体平台的爬取采集】
  • 用pd.DataFrame.to_sql方法插入万行数据耗时21秒
  • 【经典面试】87 字符串解码
  • yum 命令
  • CSP-S 2023 T1密码锁 T2消消乐
  • RISC-V IDE MRS无感远程协助模块详解
  • 【LeetCode:80. 删除有序数组中的重复项 II | 双指针】
  • Py之auto-gptq:auto-gptq的简介、安装、使用方法之详细攻略
  • SpringCloud中Turbine 1.X版本BUG
  • Javascripit类型转换比较那点事儿,双等号(==)
  • js中的正则表达式入门
  • orm2 中文文档 3.1 模型属性
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • RxJS: 简单入门
  • SOFAMosn配置模型
  • SpriteKit 技巧之添加背景图片
  • ubuntu 下nginx安装 并支持https协议
  • 判断客户端类型,Android,iOS,PC
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 微服务入门【系列视频课程】
  • 一道闭包题引发的思考
  • 用Canvas画一棵二叉树
  • ​什么是bug?bug的源头在哪里?
  • #1015 : KMP算法
  • #控制台大学课堂点名问题_课堂随机点名
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转载)从 Java 代码到 Java 堆
  • .gitignore文件_Git:.gitignore
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net 路由处理厉害了
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • @EnableConfigurationProperties注解使用
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [BT]BUUCTF刷题第9天(3.27)
  • [BZOJ1053][HAOI2007]反素数ant
  • [bzoj2957]楼房重建
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [ffmpeg] x264 配置参数解析
  • [hive] 窗口函数 ROW_NUMBER()
  • [IE技巧] IE 中打开Office文件的设置
  • [math]判断线段是否相交及夹角
  • [na]wireshark抓包排错-tcp.flags.reset