JAVA数组二分查找

Java实现数组二分查找算法 时间复杂度是指执行算法所需的计算工作量,它通常用来描述算法执行时间与输入数据大小之间的关系。对于二分查找而言,时间复杂度是衡量算法效率的重要标准。它关注的是随着数据量的增加,算法运行时间的变化趋势。 阅读详情

JAVA数组二分查找

前言

二分查找是一种比较高效的查找方式,使用此查找方式需要先将数组进行排序,如果数组未经排序效率就会很低,所以数组是必须要经过排序的。

查找原理

Created with Raphaël 2.2.0 排序后数组 计算数组中间值 判断数组中间值是否 等于我们要查找的元素 是我们查找的元素返回当前middle下标 结束 判断当前中间下标是否已经为0 返回-1代表未找到此元素 判断当前中间元素是否 大于我们要查找的元素 如果不大于那说明我们 要找的元素在中间值 的右边(数组从小到大排序), 那么递归将之前的数组的start 换为中间值。 如果不大于那说明我们 要找的元素在中间值 的左边(数组从小到大排序), 那么递归将之前的数组的end 换为中间值。 yes no yes no yes no

代码实现

@Test
    public void test1() {
        Integer[] arr = new Integer[]{4, 3, 2, 1, 5, 10, 1, 11, 1, 1, 2, 123, 42142, 1};
        arr = mergeSort(arr, Comparator.naturalOrder()); //使用二分法需要先将数组排序 (归并排序)

        for (Integer integer : arr) {
            System.out.println(integer);
        }

        System.out.println(binarySearch(arr, 42142, 0, arr.length, Comparator.naturalOrder()));
    }

    /**
     * 使用二分法查找元素,如果有多个仅仅只返回其中一个数组下标(乱序)。
     *
     * @param arr 目标数组
     * @param find 查找元素
     * @param start 数组开始下标
     * @param end 数组结束下标
     * @param comparator 元素比较规则
     * @return 查找的元素在目标数组的下标
     */
    private int binarySearch(Object[] arr, Object find, int start, int end, Comparator comparator) {
        if (arr == null) throw new NullPointerException("arr can not be empty!");

        int middle = (end - start) / 2 + start;

        int result = comparator.compare(arr[middle],find);

        if(middle == 0 && result != 0) return -1;

        if(result > 0) {
            return binarySearch(arr, find, start, middle, comparator);
        } else if(result < 0) {
            return binarySearch(arr, find, middle, end, comparator);
        } else {
            return middle;
        }
    }

    /**
     * 归并排序
     *
     * @param arr 排序数组
     * @param comparator 比较规则
     * @return 排序后的数组
     */
    private <T> T[] mergeSort(T[] arr, Comparator<T> comparator) {
        T[] cache = arr.clone();
        int step = 2;

        while (step <= arr.length * 2) {
            int c = 0;
            for (int i = 0; i < arr.length; i += step) {
                int l = i, r = l + (step >> 1) > arr.length ? arr.length : i + (step >> 1);
                int lm = r;
                int rm = i + step > arr.length ? arr.length : i + step;

                while (l < lm && r < rm) {
                    if (comparator.compare(arr[l],arr[r]) > 0) {
                        cache[c] = arr[r];
                        r++;
                        c++;
                    } else {
                        cache[c] = arr[l];
                        l++;
                        c++;
                    }
                }
                while (l < lm) {
                    cache[c] = arr[l];
                    l++;
                    c++;
                }
                while (r < rm) {
                    cache[c] = arr[r];
                    r++;
                    c++;
                }
                System.arraycopy(cache, 0, arr, 0, cache.length);
            }
            step = step << 1;
        }

        return (T[]) cache;
    }

归并排序可以参考 > 归并排序

Java实现数组的高效二分查找算法 二分查找算法作为计算机科学中的一个经典搜索算法,凭借其高效的性能和易于实现的特点,成为处理有序数据集的重要工具。通过对二分查找原理的深入理解和应用,可以显著提升数据搜索的效率,特别是在大规模数据处理场景中表现突出。大O表示法用于描述函数的运行时间或空间需求如何随输入规模的增加而变化。例如,如果一个算法的时间复杂度是O(n),那么算法的执行时间将与输入数据的大小成线性关系增长。时间复杂度是评价算法性能的关键指标之一,理解不同算法的时间复杂度对于选择合适的算法至关重要。 阅读详情

相关推荐

java数组二分查找

Java数组的二分查找代码,将给定数组排序,然后接收键盘键入的整形数字,并查找该数字。

JAVA数组篇之二分查找

二分查找的相关用法

ls199848的博客 1013

从零到一:DETR模型在自定义数据集上的实战部署与调优

本文详细介绍了DETR模型在自定义数据集上的实战部署与调优过程,包括环境准备、数据转换、模型配置、训练技巧及问题排查。通过具体代码示例和实用建议,帮助开发者高效完成从零到一的DETR模型部署,特别适合目标检测领域的实践应用。

weixin_42524100的博客 462

Java 与查找算法(2)二分查找

二分查找,也称折半查找,是一种常见的查找算法。它的思想是将有序数组分成两部分,取中间位置的值与目标值进行比较,如果相等则返回该位置,如果目标值小于中间值,则在左半部分继续查找,否则在右半部分继续查找,直到找到目标值或者数组被遍历完。二分查找的时间复杂度为 O(log n),是一种高效的查找算法。但是它要求数组必须是有序的,因此在某些情况下,为了使用二分查找,需要先对数组进行排序。递归实现二分查找的核心思想是将数组不断地分成两半,直到找到目标值或者数组被遍历完。

暗星涌动 2544

Globus 数据下载

Globus 大数据下载流程~

weixin_43978558的博客 6622

Stata面板数据OLS回归分析实战指南

OLS回归作为计量经济学的核心分析方法,通过最小化残差平方和实现参数估计,广泛应用于经济学实证研究。其技术价值在于模型简洁、结果易于解释,特别适合处理面板数据中的复杂关系。在实际应用中,配合robust标准误能有效解决异方差问题,而固定效应模型则可控制个体特异性。本文以Stata软件为例,详细演示从数据导入、描述性统计到混合OLS和固定效应模型构建的全流程,重点解析面板数据特有的格式设定、模型选择标准以及结果呈现技巧,为经济学研究者提供可直接复用的分析框架。

weixin_29051811的博客 268

二分查找(java)

leetcode题中学习二分查找

2301_76779875的博客 573

C# 上位机高级功能实战:报警、历史回放与远程监控

本文介绍了工业上位机系统的高级功能实现,主要包括实时报警机制、历史数据回放和远程监控三部分。报警功能通过阈值检测实现异常提醒;历史回放利用数据库存储数据,通过定时器控制回放进度;远程监控提供TCP、WebSocket等多种数据传输方式。文章还给出了综合优化建议,如异步处理、报警去抖动等,最终形成一个包含数据采集、显示、存储、报表及高级功能的完整工业自动化闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 750

二分查找详解(Java版)

二分查找算法是一种高效的搜索算法,适用于 有序数组。它通过将查找范围不断减半,逐步缩小目标值的搜索空间,最终找到目标元素或确认目标不存在。

记得开心一点嘛的博客 2449

基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案

最小 MVP:本地知识库 + Doubao Embedding + 简单检索。工具化:把检索/写入/系统功能通过 MCP 封装。Agent 编排:RAG 流程 + 自检 + 引用输出。这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。

lpfasd123的博客 1096

codex出现Reconnecting和stream disconnected before completion:stream closed before response.complete解决方案

本文主要介绍了在使用codex过程中出现Reconnecting和stream disconnected before completion: stream closed before response.completed的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

Java优选算法——二分查找

本文介绍了二分查找算法的应用场景和实现模板,重点讲解了如何利用"二段性"特性在非严格有序数组中使用二分法。文章详细分析了几种典型应用场景:1)基本二分查找;2)查找边界位置;3)搜索插入位置;4)平方根计算;5)山脉数组峰顶查找;6)寻找峰值元素;7)旋转数组最小值查找;8)缺失数字查找。每种场景都给出了解题思路、代码实现和边界条件处理,展示了二分查找在O(logn)时间复杂度下的高效应用。通过合理划分区间和调整中点计算方式,可以解决各种变形问题。

2301_79204376的博客 1426

com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn‘t retrieve inbound binding

错误消息:错误截图:该错误通常表示在集成配置中,未找到与特定消息匹配的入站绑定(Inbound Binding)。具体而言,错误消息中的 P/S/A(Party/Service/Action)值未在配置中找到对应的入站绑定。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

java数组二分查找的简单例题_20200227java学习之路之数组的二分查找法

一:数组二分查找法二分查找法又被称为折半查找,是一种效率较高的查找方法二分查找法的原理:将数组分为三部分,中值(最中间的值),中值前,中值后,将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。二分查找法的实例一/*需求一:运用二分查找法查找出在数组中{13,15,20,33,54,69,98,110};是否存在54这个数值?思路:1)先遍历一...

weixin_29366307的博客 323

MTK Android 12 Clone Project 克隆项目

本文介绍了如何使用MTK Android 12 Clone Project 克隆一个新的项目。通过使用绝对路径执行Perl脚本,并根据需要选择升级或降级位数,可以成功地生成一个新的项目并进行编译。希望本文对xdm有所帮助。

我其实什么都不会 942

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java 数值数组数据二分查找

Java 数值数组数据二分查找 前提: 数据需要排序后的 示例: public class ArraySearch { public static void main(String[] args) { int[] arr = new int[]{-10,-1,0,2,3,5,6,7,8}; int head = 0, end = arr.length - 1, middle...

无根的浮萍 291

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java 数组二分查找,Java数组之二分查找

简单的二分查找package com.kangkang.array;public class demo03 {public static void main(String[] args) {// 简单的二分查找,必须时有序的,无序的不能使用二分查找int[] arr = {10,20,30,40,50,60,70,80,90};int index = getIndex(arr,10);System...

weixin_39879881的博客 199

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java数组二分查找_java 13-1 数组高级二分查找

查找:1、基本查找:数组元素无序(从头找到尾)2、二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小。以下的分析是从小到大的数组二分查找分析:A:先对数组进行对半(也就是设置 min索引为0,max索引为arr.length-1,然后对半的 索引mid为(min+max)/2)B:把所需要查找的数据x跟arr[mid]进行对比a:两者的值相等,就返回mid索引b...

weixin_42127020的博客 289

Java SE 036 Java数组查找方式及二分查找剖析

Java SE 036 Java数组查找方式及二分查找剖析 前言:此笔记为圣思园张龙老师讲述的java视频课程笔记,自己看视频学习时记录的,用于积累与复习,在此分享给学习软件编程的兄弟姐妹们,以供参考。 1.数组查找 public class ArraySearchTest{ public static int search(int [] a , int value){ for(int i ...

青风百草 279

常规有序数组二分查找和旋转有序数组二分查找—Java实现

常规有序数组二分查找 二分查找又称折半查找(Binary Search),是一种效率较高的查找方法。二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一...

YUBANGSHUANGYUER的博客 448

java二分查找算法字符串数组_Java 算法——二分查找数组集合关键元素

packagecom.sinosoft;import java.util.*;importjava.util.stream.Stream;/***@authorCreated by xushuyi* @Description* @date 2019/1/17 10:41*/public classArrayTest {public static voidmain(String[] args) {/...

weixin_42500380的博客 490

关于Java有序数组和二分查找浅谈

本文主要介绍了详解Java数据结构和算法(有序数组和二分查找),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。有序数组中常常用到二分查找,能提高查找的速度。今天,我们用顺序查找和二分查找实现数组的增删改查。删除数据时必须把后面的数据向前移动来填补删除项的漏洞。以上就是本文的全部内容,希望对大家的学习有所帮助。缺点:插入时要按排序方式把后面的数据进行移动。优点:查找速度比无序数组快多了。

xiaoweids的博客 216

java实现数组二分查找

package algorithm; import java.util.Arrays; public class BinarySearch { public static int rank(int key,int[] a){ //数组必须是有序 int lo = 0; int hi = a.length - 1; while(lo <= hi) { int i = ...

bcy1252的博客 229

java二分查找算法字符串数组_Java数据结构和算法总结-数组、二分查找

前言:在平时开发中数组几乎是最基本也是最常用的数据类型,相比链表、二叉树等又简单很多,所以在学习数据和算法时用数组来作为一个起点再合适不过了。本篇博文的所有代码已上传 github ,对应工程的 array 模块,下载地址:https://github.com/lgliuwei/DataStructureStudy,项目工程为 IntelliJ IDEA 环境,童鞋不妨下载下来,参照着代码看博文岂...

weixin_42510914的博客 362

java中数组的线性查找和二分查找算法

一、对数组的线性查找算法。 查找:顾名思义,是自己想要的元素在数组中寻找,看看是否在数组中。 线性查找的原理:线性查找是最基本的查找方式,它是通用自己想获得的目标元素与数组中各个元素进行比对,比对成功则找到该目标元素,反之未找到。 下面使用java语言来编写实现对数组线性查找的方法: //定义线性查找的方法,参数为目标元素 public static void LineSearch(...

weixin_42132733的博客 551
上一篇: JAVA volatile修饰符的作用
下一篇: 平衡查找二叉树(AVL树)的讲解与实现(JAVA版本)
hellopeng1
博客等级 码龄10年 66粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值