算法(二)二分查找

news2025/2/28 6:33:56

文章目录

  • 二分查找简介
  • 实现方式
    • 循环方式
    • 递归方式
  • 经典例子

二分查找简介

  • 二分查找(binary search)算法,也叫折半算法。
  • 二分查找是针对有序的数据集合的查找办法,如果是无序的数据结合就使用遍历。
  • 二分查找之所以快速,是因为它再匹配不成功的时候,每次都能排除剩余元素中一半的元素,因此包含目标元素的有效范围就会收缩非常快。
  • 时间复杂度: T(n) = O(logn)
    在这里插入图片描述

实现方式

循环方式

package com.xxliao.algorithms.binary_search.demo;

/**
 * @author xxliao
 * @description: 在一个有序集合中,查找某数是否存在 -- 基础实现
 * @date 2024/5/30 0:40
 */
public class Demo01 {

    public static void main(String[] args) {
        //有序数组
        int[] nums = {3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82};
        System.out.println(binarySearch(nums,66));
        System.out.println(binarySearch(nums,55));
    }

    /**
     * @description  二分法基础实现
     * @author  xxliao
     * @date  2024/5/30 0:47
     */
    public static int binarySearch(int[] array,int destNum) {
        // 低索引
        int low = 0;
        // 高索引
        int high = array.length -1;
        // 中间索引
        int mid = 0;
        while(low<=high) {
            mid = (low + high) / 2;
            if(array[mid] == destNum) {
                return mid; //相等,找到该索引
            }else if(destNum < array[mid]){
                high = mid - 1; // 比中间值小,
            }else{
                low = mid + 1; // 比中间值大
            }
        }
        return -1;
    }
}

测试结果:
在这里插入图片描述

递归方式

package com.xxliao.algorithms.binary_search.demo;

/**
 * @author xxliao
 * @description: 在一个有序集合中,查找某数是否存在 -- 递归实现
 * @date 2024/5/30 0:40
 */
public class Demo02 {

    public static void main(String[] args) {
        //有序数组
        int[] nums = {3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82};
        System.out.println(binarySearch(nums,48));
        System.out.println(binarySearch(nums,55));
    }

    /**
     * @description  二分法 递归实现
     * @author  xxliao
     * @date  2024/5/30 0:47
     */
    public static int binarySearch(int[] array,int destNum) {
        // 低索引
        int low = 0;
        // 高索引
        int high = array.length -1;
        return binarySearch(array,low,high,destNum);
    }

    private static int binarySearch(int[] array,int low,int high,int destNum){
        //定义递归结束条件
        if(low > high)
            return -1;
        int mid = (low + high) / 2;
        if(array[mid] == destNum) {
            return mid; //相等,找到该索引
        }else if(destNum < array[mid]){
            high = mid - 1; // 比中间值小,
        }else{
            low = mid + 1; // 比中间值大
        }
        return binarySearch(array,low,high,destNum);
    }
}

测试结果:
在这里插入图片描述

经典例子

一个有序数组有一个数出现1次,其他数出现2次,找出出现一次的数
比如:1 1 2 2 3 3 4 4 5 5 6 6 7 出现1次的数是7。

使用二分查找: 1 有序、 2、时间复杂度 O(logn)。
偶数位索引跟后面的比相同,奇数位索引跟前面的比相同 则说明前面的都对。
偶数位索引跟前面的比相同,奇数位索引跟后面的比相同 则说明后面的都对。

package com.xxliao.algorithms.binary_search.demo;

/**
 * @author xxliao
 * @description:
 * 一个有序数组有一个数出现1次,其他数出现2次,找出出现一次的数
 * 比如:1 1 2 2 3 3 4 4 5 5 6 6 7 出现1次的数是7
 *
 * 使用二分查找: 1 有序、 2、时间复杂度 O(logn)
 * 偶数位索引跟后面的比相同,奇数位索引跟前面的比相同 则说明前面的都对
 * 偶数位索引跟前面的比相同,奇数位索引跟后面的比相同 则说明后面的都对
 *
 * @date 2024/5/30 1:06
 */

public class Demo03 {
    public static void main(String[] args) {
        int[] nums={1,2,2,3,3,4,4,5,5};
        //int[] nums = {1,1, 2, 2, 3, 4, 4, 5, 5,6,6,7,7};
        System.out.println(binarySearch(nums));
    }

    public static int binarySearch(int[] nums) {
        //低位索引
        int low = 0;
        //高位索引
        int high = nums.length - 1;
        //中间索引
        int mid = 0;
        while (low < high) {

            mid = (low + high) / 2;

            if (mid % 2 == 0) {//偶数位

                if (nums[mid] == nums[mid + 1]) {
                    // 与后面的数相等,前面的都对
                    low = mid + 1;
                } else if (nums[mid] == nums[mid - 1]) {
                    // 与前面的数相等,后面的都对
                    high = mid - 1;
                } else {// 就是这个数
                    return nums[mid];
                }
            } else {//奇数位

                if (nums[mid] == nums[mid - 1]) {
                    // 与前面的数相等,前面的都对
                    low = mid + 1;
                } else if (nums[mid] == nums[mid + 1]) {
                    //与后面的数相等,后面的都对
                    high = mid - 1;
                } else { // 就是这个数
                    return nums[mid];
                }
            }
        }
        //low=high
        return nums[low];
    }
}

测试结果:
在这里插入图片描述

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

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

相关文章

MATLAB的plot3使用技巧|更改视角|例程分享链接

plot3命令 MATLAB的plot3函数是用来绘制3D图形的函数。它可以将三维数据可视化为线段、点、曲线等形式。plot3函数可以用于绘制三维空间中的曲线、曲面、散点图等。 plot3函数的基本用法是&#xff1a; plot3(X,Y,Z)&#xff1a;绘制三维线段&#xff0c;其中X、Y、Z分别是包…

使用C#实现VS窗体应用——画图板

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。&#x1f34e;个人主页&#xff1a;Meteors.的博客&#x1f49e;当前专栏&#xff1a;小项目✨特色专栏&#xff1a; 知识分享&#x1f96d…

FinalShell无法连接Linux

Linux使用Vmware会创建一个网络&#xff0c;让两个子网处于一个网关&#xff0c;这样就能在windows中连接Linux&#xff0c;只有在这种情况下才能FinalShell才能连接Linux

Java过滤特殊空格nbsp;

现象&#xff1a; 用Java处理excel文件中的以下字符串时&#xff0c;想去除此空格&#xff0c;却发现用String.trim()没有直到预期效果&#xff1a; 原因&#xff1a; 在网上找了下&#xff0c;应该是这其实是html中经常使用的一种特殊空格字符&nbsp&#xff1b; 处理&a…

关于PyQt5的TreeWidget的与百度Ai的问答

中肯的讲啊&#xff0c;不带有任何色彩啊&#xff0c;百度Ai在编程这方面确实差了点。确实是在网罗所有资料&#xff0c;但是收集起来不能进行深度的分析&#xff0c;好像没有设置一个自己先把总结出的代码答案运行一下的功能&#xff0c;所以有时候给出的代码答案根本跑不了。…

Java基础语法——字符串(String/StringBuilder/Stringjoiner)

String Java的String类是不可变的&#xff0c;意味着一旦创建&#xff0c;其值就不能被改变。String类提供了丰富的API来操作字符串。 以下是一些常用的方法&#xff1a; 构造方法&#xff1a; 有以下几种常见的&#xff1a; public class stringlearn {public static void…

基于知识图谱分析贸易关系走向

基于知识图谱分析贸易关系走向 前言一、基础数据二、贸易规则三、知识图谱可视化四、完整代码 前言 知识图谱是一种用图模型来描述知识和建模世界万物之间的关联关系的技术方法。在贸易关系的分析中&#xff0c;知识图谱可以将各个国家、地区、商品、贸易政策等作为节点&#…

【文件fd】回顾C语言文件操作 | 详细解析C语言文件操作写w追加a | 重定向和“w““a“

目录 前言 回顾C语言的操作 Q1 Q2 Q3 C语言文件操作 w方式 a方式 重定向和"w""a"方式 前言 前面进程虚拟地址空间让我们对进程的理解更加深入。在基础IO我们会详细介绍文件和文件系统。本专题的核心内容是文件。 深刻理解文件&#xff08;站在…

力扣Hot100-有效的括号(栈stack)

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

⌈ 传知代码 ⌋ 基于BERT的语义分析实现

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

江苏大信环境科技有限公司:环保领域的开拓者与引领者

2009 年&#xff0c;江苏大信环境科技有限公司在宜兴环保科技工业园成立。自创立之始&#xff0c;该公司便笃定坚守“诚信为本、以质量求生存、以创新谋发展”这一经营理念&#xff0c;全力以赴为客户构建专业的工业有机废气治理整体解决方案&#xff0c;进而成为国家高新技术企…

Java基础语法规范

语法规范 public class HelloWorld{ //类名&#xff1a; 1. 首字母要大写 2. 源文件名与类名相同// 单行注释/* 多行注释除这两个之外还有文档注释。不重要* /public static void main (String[] args){ /* 1. main()⽅法是类体中的主⽅法&#xff0c;该⽅法从{开始到}结束…

基于 Apache Doris 的实时/离线一体化架构,赋能中国联通 5G 全连接工厂解决方案

作者&#xff1a;田向阳&#xff0c;联通西部创新研究院 大数据专家 共创&#xff1a;SelectDB 技术团队 导读&#xff1a; 数据是 5G 全连接工厂的核心要素&#xff0c;为支持全方位的数据收集、存储、分析等工作的高效进行&#xff0c;联通 5G 全连接工厂从典型的 Lambda 架…

华为SSH实验

华为SSH实验 实验拓扑&#xff1a; 实验要求&#xff1a;从SSH客户端AR1采用stelnet方式登录到SSH 服务器端。 实验步骤&#xff1a; 1.完成基本配置&#xff08;略&#xff09; sys Enter system view, return user view with CtrlZ. [AR1]sys CLIENT [CLIENT]INT g0/0/0 [C…

【IB Protocal Serial--WQE】

IB Protocal Serial--WQE 1 Intro1.1 What1.2 IBA WQE 本系列文章介绍RDMA技术的具体实现–InfiniBand Protocal&#xff1b; Introduce the features, capalities,components, and elements of IBA. the principles of operation. 1 Intro 1.1 What 理解IB协议下面这三句话对…

思迈特受邀参加工信部等权威机构行业盛会,探讨AI领域前沿技术

近日&#xff0c;思迈特软件作为国产BI领域知名厂商&#xff0c;多次受邀出席行业盛会&#xff0c;与众多业内专家学者、行业精英及知名企业代表等汇聚一堂共襄盛会&#xff0c;探讨行业前沿热点研究及最新趋势&#xff0c;分享企业数字化建设创新成果与成功实践&#xff0c;共…

一文学懂Base64编码原理

前言 Base64编码与ASCII编码一样&#xff0c;也是一种编码方式。不同的是ASCII码采用7位二进制数表示&#xff08;包括大小写字母、数字、标点符号和一些不可见字符&#xff09;&#xff0c;而Base64采用6位二进制数表示&#xff08;包括大小写字母、0~9数字、和/&#xff09;…

【考试100】安全员B证《建设工程安全生产技术》单选题

​ 题库来源&#xff1a;考试100 【考试100】安全员B证《建设工程安全生产技术》单选题 1&#xff0e;在悬空部位作业时&#xff0c;操作人员应&#xff08; &#xff09; A.遵守操作规定 B.进行安全技术交底 C.戴好安全帽 D.系好安全带 【考试100答案】&#xff1a;D…

Nginx企业级负载均衡:技术详解系列(14)—— 账户认证功能

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 你有没有听说过Nginx的账户认证功能&#xff1f;这可不只是一个技术问题&#xff0c;它关系到我们上网时的安全和便利。就像家里需要一把钥匙才能进们一样&#xff0c;Nginx的账户认证功能就是确保有只有授权的人才能…

C# 写一个简单的Windows Service的服务程序

项目创建及设定部分 使用VS2019创建项目&#xff0c;选择C# Service的选项 按照你喜欢的方式命名&#xff0c;我这边就默认了 添加安装服务&#xff0c;在Service1.cs[Design]中 在设计界面右击&#xff0c;选择如下的"Add Installer" 在出现的"ProjectInstall…