Java算法:二分查找

news2024/11/24 7:15:46

一、 二分查找注意

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

二、二分查找高效算法

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

     在一个有序数组中查找特定元素时,二分查找是一种高效的算法。它的时间复杂度为 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),因此对于大型数组的查找操作非常高效。此外,由于二分查找是基于数组的有序性进行查找的,因此可以应用于静态数据集合中的查找操作。

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

 

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

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

相关文章

华纳云:centos系统中怎么查看cpu信息?

在CentOS系统中&#xff0c;我们可以使用一些命令来查看CPU的详细信息。下面介绍几个常用的命令&#xff1a; 1. lscpu lscpu命令可以显示CPU的架构、型号、核心数、线程数、频率等信息。 # lscpu 执行以上命令后&#xff0c;会输出类似以下内容&#xff1a; 2. cat /proc/…

【JAVA学习笔记】54 - 集合 - Set类、HashSet类、TreeSet类(难点)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/set_ Set类 一、基本介绍 1.无序(添加和取出的顺序不一致) ,没有索引[后面演示] 2.不允许重复元素&#xff0c;所以最多包含一个null 3.JDK API中Set接口的实现类有: …

jvs-logic逻辑引擎功能新增:逻辑凭证、自定义权限控制等等

新增: 1.新增逻辑复制功能&#xff1b;主要用于数据的同步和复制 2.逻辑新增权限设置功能&#xff1b; 每个逻辑可以设置不同的权限&#xff0c;逻辑页的功能权限配置默认是全部赋权给应用授权的相关人员&#xff0c;也可以按照自定义配置&#xff0c;如图所示&#xff0c;选…

rhcsa-数据流和重定向

cp cp 选项 源文件 目标文件 ****-a 复制目录的所有信息&#xff08;保留文件信息&#xff09; -p保留原文件的权限&#xff0c;所有者以及时间戳的信息 -r复制目录及所有子目录的所有文件 例&#xff1a; cp -p 复制的源文件 复制的目标路径 mv 作用&#xff…

ChatGLM2-6B下载与部署

0 写在前面 我们首先来看一下ChatGLM2-6B模型的requirements: protobuf transformers4.30.2 cpm_kernels torch>2.0 gradio mdtex2html sentencepiece accelerate sse-starlette streamlit>1.24.0可以看到&#xff0c;要求torch>2.0&#xff0c;这就产生了一个问题&…

解决uniapp的video标签和transition属性使用时出现错位的问题

template&#xff1a;三个视频都每个占满屏幕&#xff0c;点击按钮滚动最外层bgBox元素&#xff0c; style: 想要加上动画过渡效果&#xff1a; 这是显示第一个视频&#xff1a; 点按钮向上滑动滚动到第二个视频时&#xff1a; 视频错位了 &#xff0c;因为视频消失又出现的时候…

一款支持星座、干支、生肖、节气、节日、彭祖百忌、每日宜忌等超卷的日历工具库

大家好&#xff0c;我是凌览。 日常GitHub划水发现一款超级6的日历工具库lunar&#xff0c;它支持阳历、阴历、佛历和道历&#xff0c;甚至还玩上了星座、干支、生肖、节气、节日、彭祖百忌、每日宜忌、吉神宜趋、凶煞宜忌、吉神方位、冲煞、纳音、星宿、八字、五行、十神、建…

day58--动态规划16

583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 第一题&#xff1a;两个字符串的删除操作 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: &qu…

单元测试学习

回顾测试理论基础 单元测试基础知识 什么是单元测试 单元测试流程、测试计划 测试策略设计、实现 单元测试 - 执行 HTML 报告生成 1 软件测试分类 目标 回顾测试理论知识-测试分类 1. 测 试分类 代码可见度上-划分分类&#xff1a; 1. 黑盒测试 2. 灰盒测试 3. …

Mac允许任何来源的的安装包进行安装

首先打开终端&#xff0c;开启“任何来源”&#xff0c;执行如下命令&#xff1a; sudo spctl --master-disable 然后回车&#xff0c;继续输入密码&#xff08;密码输入时是不可见的&#xff09;&#xff0c;然后回车。 接着打开【系统偏好设置】&#xff0c;选择【安全性与…

梦百合上榜2023鼎革奖数字化转型先锋榜

10月26日,第六届“鼎革奖”数字化转型先锋榜单揭晓,梦百合家居凭借数字化生产的卓越成果——SAP管理平台及供应链项目,入选2023【鼎革奖】数字化转型先锋榜年度供应链转型典范,梦百合家居COO 崔慧明同步入选2023【鼎革奖】数字化转型先锋榜年度首席运营官。 据了解,「鼎革奖」数…

用CHAT编写代码

今天小编带大家来试试用CHAT 写代码 问&#xff1a;本题要求编写程序&#xff0c;计算出从n个不同元素中取出m个元素&#xff08;m≤n&#xff09;的组合数。用c语言 CHAT 回复&#xff1a;在C语言中&#xff0c;我们可以通过事先定义一个函数用于计算阶乘&#xff0c;然后利用…

在如今的大环境下你是否选择测试岗?——打造敏捷测试团队

摘要&#xff1a;敏捷转型大潮汹涌而来&#xff0c;各大技术公司均被卷入其中&#xff0c;在管理层的重视下&#xff0c;效能提升成为测试团队日常工作的口头禅。但是我们也看到&#xff0c;敏捷转型的效果参差不齐&#xff0c;真正深入理解敏捷要义的骨干员工数量很少&#xf…

Maven Repository使用

1.Maven Repository网站 https://mvnrepository.com/https://mvnrepository.com/ 2.查询需要的依赖 3.参考例子 <!-- https://mvnrepository.com/artifact/org.freeswitch.esl.client/org.freeswitch.esl.client --> <dependency> <groupId>org.freesw…

needle库下载TypeScript程序用HTTP做个爬虫模版

下面是一个使用needle库进行下载的TypeScript程序&#xff0c;它下载了pinduoduo的内容&#xff0c;并且使用了proxy_host为duoip&#xff0c;proxy_port为8000的爬虫IP。 import needle from needle;// 设置爬虫IP needle.requestDefaults({proxy: {host: duoip,port: 8000} }…

不擅长花言巧语,但擅长把好东西分享给你

现在买冬装&#xff0c;不是为了让你立马穿上 而是等到寒冷天气的来临 别人你还在急急忙忙准备冬衣时 你的宝贝已经穿上新衣快快乐乐地出门啦

【C++代码】买卖股票最佳时机系列,动态规划--代码随想录

题目&#xff1a;买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你…

使用lua-resty-request库编写爬虫IP实现数据抓取

目录 一、lua-resty-request库介绍 二、使用lua-resty-request库进行IP数据抓取 1、获取IP地址 2、设置请求 3、处理数据 三、代码实现 四、注意事项 五、总结 本文将深入探讨如何使用lua-resty-request库在爬虫程序中实现IP数据抓取。我们将首先介绍lua-resty-request…

Mac安装DBeaver

目录 一、DBeaver Mac版软件简介 二、下载地址 三、DBeaver连接失败报错 3.1 问题描述 3.2 连接失败问题解决 一、DBeaver Mac版软件简介 DBeaver Mac版是一款专门为开发人员和数据库管理员设计的免费开源通用数据库工具。软件的易用性是它的宗旨&#xff0c;是经过精心设计…

AMEYA360祝贺:大唐恩智浦荣获「2023年度最佳电源管理芯片奖」

2023年10月30日&#xff0c;由芯师爷主办、慕尼黑华南电子展协办、深圳市半导体行业协会支持的“第五届硬核芯生态大会暨2023汽车芯片技术创新与应用论坛”及“2023 年度硬核芯评选颁奖盛典”在深圳圆满落幕。 本次峰会以“芯生万象&#xff0c;集成未来”为主题&#xff0c;汇…