二分查找法

二分查找法

  • 一、标准二分查找法
  • 二、改动版二分查找法
  • 三、平衡版二分查找法
  • 四、二分查找法查找最左元素
  • 五、二分查找法查找最右元素
  • 六、二分查找法之返会插入位置

一、标准二分查找法

	/**
     * 标准二分查找
     */
    public static int binarySearch(int[] arr, int target) {
        int i = 0, j = arr.length - 1; // 1.定义查找范围为左闭右闭
        while (i <= j) {
            int m = (i + j) >>> 1; // 2.无符号右移一位
            if (arr[m] < target) {
                i = m + 1;  // 3.目标值大于中间值,所以在右范围查询
            } else if (target < arr[m]) {
                j = m - 1; // 4.目标值小于中间值,所以在左范围查询
            } else {
                return m; // 目标==中间值
            }
        }
        return -1;
    }

二、改动版二分查找法

	/**
     * 改动版二分查找
     */
    public static int modifyBinarySearch(int[] arr, int target) {
        int i = 0, j = arr.length; // 1.定义查找范围为左闭右开
        while (i < j) {
            int m = (i + j) >>> 1; // 2.无符号右移一位
            if (arr[m] < target) {
                i = m + 1;  // 3.目标值大于中间值,所以在右范围查询
            } else if (target < arr[m]) {
                j = m; // 4.目标值小于中间值,所以在左范围查询(j作为右边界不参与比较,m本身已经比较过)
            } else {
                return m; // 目标==中间值
            }
        }
        return -1;
    }

三、平衡版二分查找法

    /**
     * 平衡版二分查找
     */
    public static int BalanceBinarySearch(int[] arr, int target) {
        int i = 0, j = arr.length; // 1.定义查找范围为左闭右开
        while (1 < j - i) { // j和i至少有一个元素
            int m = (i + j) >>> 1; // 2.无符号右移一位
            if (arr[m] <= target) {
                i = m;  // 3.目标值大于中间值,所以在右范围查询
            } else {
                j = m; // 4.目标值小于中间值,所以在左范围查询(j作为右边界不参与比较,m本身已经比较过)
            }
        }
        if (arr[i] == target) {
            return i;
        } else {
            return -1;
        }

    }

四、二分查找法查找最左元素

    /**
     * 二分查找之查找最左
     */
    public static int leftBinarySearch(int[] arr, int target) {
        int i = 0, j = arr.length-1; // 1.定义查找范围为左闭右闭
        int t = -1;
        while (i <= j) {
            int m = (i + j) >>> 1; // 2.无符号右移一位
            if (arr[m] < target) {
                i = m + 1;  // 3.目标值大于中间值,所以在右范围查询
            } else if (target < arr[m]) {
                j = m - 1; // 4.目标值小于中间值,所以在左范围查询(j作为右边界不参与比较,m本身已经比较过)
            } else {
                t = m; // 目标==中间值
                j = m -1;
            }
        }
        return t;
    }

五、二分查找法查找最右元素

    /**
     * 二分查找之查找最右
     */
    public static int rightBinarySearch(int[] arr, int target) {
        int i = 0, j = arr.length-1; // 1.定义查找范围为左闭右闭
        int t = -1;
        while (i <= j) {
            int m = (i + j) >>> 1; // 2.无符号右移一位
            if (arr[m] < target) {
                i = m + 1;  // 3.目标值大于中间值,所以在右范围查询
            } else if (target < arr[m]) {
                j = m - 1; // 4.目标值小于中间值,所以在左范围查询(j作为右边界不参与比较,m本身已经比较过)
            } else {
                t = m; // 目标==中间值
                i = m + 1;
            }
        }
        return t;
    }

六、二分查找法之返会插入位置

    /**
     * 二分查找之查找最右
     */
    public static int insertionBinarySearch(int[] arr, int target) {
        int i = 0, j = arr.length-1; // 1.定义查找范围为左闭右闭
        while (i <= j) {
            int m = (i + j) >>> 1; // 2.无符号右移一位
            if (arr[m] < target) {
                i = m + 1;  // 3.目标值大于中间值,所以在右范围查询
            } else if (target <= arr[m]) {
                j = m - 1; // 4.目标值小于中间值,所以在左范围查询(j作为右边界不参与比较,m本身已经比较过)
            }
        }
        return i;
    }

测试代码:

    public static void main(String[] args) {
        int[] nums = {1, 3, 6,6,6, 8, 12, 15, 23, 26, 31, 35};

        /* 二分查找(双闭区间) */
        int index = binarySearch(nums, 6);
        System.out.println("目标元素 6 的索引 = " + index);
        int index2 = binarySearch(nums, 5);
        System.out.println("目标元素 5 的索引 = " + index2);


        /* 二分查找(左闭右开区间) */
        int index3 = modifyBinarySearch(nums, 6);
        System.out.println("目标元素 6 的索引 = " + index3);
        int index4 = modifyBinarySearch(nums, 5);
        System.out.println("目标元素 5 的索引 = " + index4);

        /* 平衡板二分查找 */
        int index5 = BalanceBinarySearch(nums, 6);
        System.out.println("目标元素 6 的索引 = " + index5);
        int index6 = BalanceBinarySearch(nums, 5);
        System.out.println("目标元素 5 的索引 = " + index6);

        /* 平衡板二分查找 */
        int index7 = leftBinarySearch(nums, 6);
        System.out.println("目标元素 6 的索引 = " + index7);
        int index8 = leftBinarySearch(nums, 5);
        System.out.println("目标元素 5 的索引 = " + index8);


        int index9 = rightBinarySearch(nums, 6);
        System.out.println("目标元素 6 的索引 = " + index9);
        int index10 = rightBinarySearch(nums, 5);
        System.out.println("目标元素 5 的索引 = " + index10);

        int index11 = insertionBinarySearch(nums, 6);
        System.out.println("目标元素 6 的索引 = " + index11);
        int index12 = insertionBinarySearch(nums, 5);
        System.out.println("目标元素 5 的索引 = " + index12);
    }

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

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

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

相关文章

6.1 if语句

计算机语言和人类语言类似&#xff0c;人类语言是为了解决人与人之间交流的问题&#xff0c;而计算机语言是为了解决程序员与计算机之间交流的问题。程序员编写的程序就是计算机的控制指令&#xff0c;控制计算机的运行。借助于编译工具&#xff0c;可以将各种不同的编程语言的…

2024 Google I/O 宣布正式支持 Kotlin Multiplatform ,那 KMP 是什么?它的未来在哪里?

基于最近一直有人和我提 KMP &#xff0c;那就简单聊聊。 2024 Google I/O 正式官宣了支持 KMP &#xff0c;而一般意义上的 KMP 指的就是 Kotlin Multiplatform &#xff0c;它是 Google Workspace 团队的一项长期「投资」项目&#xff0c;这里有个重点&#xff0c;那就是 Ko…

Day 59 503.下一个更大元素Ⅱ 42.接雨水

下一个更大元素Ⅱ 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&#xff0c;这意味着你应该循环…

Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance()

Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance() 从java9开始, class.newInstance()已过时, 被加上Deprecated强烈反对注解 SuppressWarnings("removal")CallerSensitiveDeprecated(since"9")public T newInstance()throws …

使用xsd验证xml格式的正确性

1.1 基础知识介绍 XML简介&#xff1a;XML是可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;的缩写&#xff0c;它是一种数据表示格式&#xff0c;可以描述非常复杂的数据结构&#xff0c;常用于传输和存储数据。xml文件、xml消息。XSD简介&#xff1a;是X…

基于轻量级神经网络GhostNet开发构建CIFAR100数据集场景下的图像识别分析系统,对比不同分辨路尺度下模型的性能情况

Cifar100数据集是一个经典的图像分类数据集&#xff0c;常用于计算机视觉领域的研究和算法测试。以下是关于Cifar100数据集的详细介绍&#xff1a; 数据集构成&#xff1a;Cifar100数据集包含60000张训练图像和10000张测试图像。其中&#xff0c;训练图像分为100个类别&#x…

基于图鸟UI的资讯名片模版开发与应用

一、引言 在前端技术日新月异的今天&#xff0c;快速、高效、美观的UI组件库和模板成为了开发者们关注的焦点。图鸟UI作为一款集成了基础布局元素、配色体系、图标icon和精选组件的UI框架&#xff0c;为前端开发者提供了极大的便利。本文将以图鸟UI为基础&#xff0c;探讨基于…

汀木云OZON选品工具,OZON跨境电商的选品利器

在竞争激烈的跨境电商市场中&#xff0c;选品是卖家们成功经营的关键之一。而汀木云OZON选品工具&#xff0c;作为OZON跨境电商的选品利器&#xff0c;以其独特的优势&#xff0c;为卖家们提供了精准、高效的选品解决方案。接下来看看汀木云OZON选品工具和萌啦OZON数据跨境OZON…

Unity3D输入事件

文章目录 前言一、全局事件二、射线三、点选3D模型四、点击地面控制人物移动总结 前言 Unity输入事件分为两类&#xff0c;全局触发和监听式触发。全局触发通常是运行在update在每帧进行检测&#xff0c;而监听式触发是被动的输入事件。 一、全局事件 在最新的unity中有新和旧…

docker-compose 搭建 单机版ELK

docker-compose 搭建 单机版ELK 前言 本次部署将使用ElasticSearch官方的镜像和Docker-Compose来创建单节点的ELK&#xff0c;用于学习ELK操作。在k8s集群内&#xff0c;如果每天的日志量超过20G以上&#xff0c;建议部署在k8s集群外部&#xff0c;以支持分布式集群的架构。在…

人类听觉处理和语言中枢

人类听觉概述 人类听觉是指通过耳朵接收声音并将其转化为神经信号&#xff0c;从而使我们能够感知和理解声音信息的能力。听觉是人类五种感觉之一&#xff0c;对我们的日常生活和交流至关重要。 听觉是人类交流和沟通的重要工具。通过听觉&#xff0c;我们能够听到他人的语言…

计算机专业实习生应该去哪实习?

计算机专业实习生可以选择在各种不同类型的公司和组织中实习。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 这取…

高稳定数显芯片防干扰抗噪数码屏驱动高亮LED驱动IC-VK16K33A/AA 最大13×3的按键扫描

产品型号&#xff1a;VK16K33A/AA 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP28/SSOP28 原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01; 概述 VK16K33A/AA是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有数据…

C#读取.sql文件并执行文件中的sql脚本

有些时候我们需要在程序中编写读取sql脚本文件并执行这些sql语句&#xff0c;但是我们在有些时候会遇到读出来的sql语句不能执行&#xff0c;其实不能执行并不是你的sql脚本文件有错误&#xff0c;而是去执行sql语句的时候&#xff0c;C#代码里面执行sql语句的代码对sql里面的一…

【DevOps】深入浅出:Jenkins 性能监控全解析

目录 一、监控指标&#xff1a;把握系统健康状况 1、资源利用率&#xff1a; 2、 任务执行效率&#xff1a; 3、系统稳定性&#xff1a; 二、监控工具&#xff1a;选择合适的利器 1、Jenkins 内置监控 1.1、Jenkins Performance Plugin&#xff1a;系统性能指标的直观展…

3D工业视觉

前言 本文主要介绍3D视觉技术、工业领域的应用、市场格局等&#xff0c;主要技术包括激光三角测量、结构光、ToF、立体视觉。 一、核心内容 3D视觉技术满足工业领域更高精度、更高速度、更柔性化的需求&#xff0c;扩大工业自动化的场景。 2D视觉技术基于物体平面轮廓&#…

【译】MySQL 组复制 - 部分网络故障对性能的影响

原文地址&#xff1a;MySQL Group Replication – Partial Network Failure Performance Impact 在这个由两部分组成的博客系列中&#xff0c;我想介绍一些使用组复制的故障转移场景。在第一部分中&#xff0c;我将讨论我在撰写这些文章时发现的一种有趣的行为和性能下降。在第…

Java方法的递归

Java方法的递归 前言一、递归的概念示例代码示例 二、递归执行过程分析代码示例执行过程图 三、递归练习代码示例按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)递归求 1 2 3 ... 10写一个递归方法&#xff0c;输入一个非负整数&#xff0c;返回组成它的数字之和. …

全网首发UNIAPP功能多的iapp后台源码

全网首发UNIAPP功能多的iapp后台源码&#xff0c;众所周知UN Dev Assist 后台是一款既不免费又不好用的后台今天直接分享。 搭建教程在里面了&#xff0c;自己查看。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89291994 更多资源下载&#xff1a;…