Java二分查找算法详解
二分查找
- 引言
- 什么是二分
- 二分的定义及二分查找算法的思路
- 二分定义
- 二分查找算法的思路
- 二分查代码具体实现
- 伪代码
- 实现代码
引言
假如给你一个有序数组,然后给你一个数,让你去数组中找出该元素。如果数组中存在该元素,则返回该数在数组中的下标,如果不存在则返回-1。
如果是你,你会怎么做?给你三秒钟时间考虑,1、2、3,时间到。
是顺序查找吗?写一个循环,遍历整个数组去和目标数比较?那如果数据量很大,而且需找到的数在数组的最后面,那是不是太慢了?比如一个从0开始到9999的数组,我要查找9999这个数,是不是要比较9999+1次,才能得出9999所在的下标?有没有更简单的方法找出?
有,不要忘记我们的另一个条件,数组是有序的,对于有序的数组我们可以使用二分查找,又称对半查找、折半查找等等,虽然别名很多,但实现原理都是一样的。
什么是二分
二分查找,顾名思义,这种算法的精髓就在于二分,那什么是二分?它又是怎么实现二分的呢?
二分的定义及二分查找算法的思路
二分定义
二分就是每次把当前需要寻找的数组分成两半,那么我需要寻找的这个数只可能在左半边,或者右半边,这样一来我每次分完,所需要查找的元素的个数就是上一次查找元素个数的一半。
比如[1 ,4, 9, 15, 27, 49, 128, 157]这个数组,我第一次把元素以27为中点,分为左边4个,右边3个。然后再查找,我们以左边为例,左边4个元素我们以9为中点分割,分为左边2两个元素,右边一个元素。。。。直至分割到元素只有一个时结束。
二分查找算法的思路
从上面的例子中不难看出二分查找的步骤如下:
先找出当前判断的数组中点,将目标值与当前中点值比较,判断是继续在左侧查找还是在右侧查找,直到需要判断的数组元素为1个时,判断此元素是否是需要查的元素,若是则返回该元素下标,否则则返回-1,结束查找。
二分查代码具体实现
伪代码
/** 二分查找* arr输入数组* x目标值* left二分左边界* right二分右侧边界*/
public static int binarySearch(int[] arr, int target , int left , int right) {//判断是否已经到达出口--即元素不存在当前需判断的数组元素中//找出中间的值的下标//判断目标值在当前值的左侧还是右侧 //在左侧则对左侧执行二分法查找//在右侧则对右侧执行二分法查找//若当前中点值就是目标值则结束方法 返回结果}
实现代码
/** 二分查找* arr输入数组* x目标值* left二分左边界* right二分右侧边界*/public static int binarySearch(int[] arr, int target , int left , int right) {/** 目标值比最左侧的小 或者 比如数组为[1,6,9,14] 找-1 就会结束查找* 目标值比最右侧的大 或者 比如数组为[1,6,9,14] 找18 就会结束查找* 左侧下标大于右侧下标 比如数组为[1,6,9,14] 找4 就会结束查找* *///判断是否已经到达出口--即元素不存在当前需判断的数组元素中if(target < arr[left] || target > arr[right] || left > right){return -1; }//找出中间的值的下标int mid = (left + right)/2;//判断目标值在当前值的左侧还是右侧 if(arr[mid] > target && left <= right) {//递归左侧return binarySearch(arr,target , left , mid-1);}else if(arr[mid] < target && left <= right) {//递归右侧return binarySearch(arr,target, mid+1 , right);}else {//目标值与中点值相等return mid;}}
Java二分查找算法详解相关推荐
- 二分查找算法详解(附代码)
二分查找算法详解(附代码) 注: 现有一个升序 不重复的数组 查询target是否在此数组中并返回序号 使用条件 使用二分算法的两个条件: 有序 不重复 混淆处 二分算法两种方式容易弄混淆的地方:就是 ...
- 二分查找算法详解(经典二分和左右边界查找)
目录 二分查找算法 1. 二分查找算法框架 2. 经典二分查找算法 问题1. 为什么while循环中使用<=号而不是用<号,右边区间right为什么要对数组大小减一? 问题2. 为什么 l ...
- python实现二分查找代码+详解
python实现二分查找代码+详解 一.规定函数值 函数输入值 li=[1,2,3,4,5,6,7,8,9]#输入的集合 val=4#要查找的值 函数内部值 left=0#代表集合中第一个值的位置 r ...
- Java 二分查找算法及效率比较
1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值 ...
- 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)
一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...
- java的数组查找算法_java数组、排序算法、查找算法详解
1.为什么定义数组要采用type[] arrayName;这种方式? 因为这种方式具有很好的可读性,使用这种方式很容易就可以理解这是定义一个变量,其中变量名是arrayName,变量的类型是type[ ...
- Python二分查找/折半查找算法详解--(面试常考)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 二分查找也称折 ...
- Java垃圾回收算法详解
1 概述 在前一篇文章中讲到了Java虚拟机的基础知识和运行时数据区的划分,在运行时数据区的划分中,可分为线程共享区域和线程私有区域,而Java的垃圾回收就发生在线程共享区域中,更直观的说法就是Jav ...
- C语言【二分查找】详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 二分 文章目录 前言 一.[二分查找]的步骤 二.[二分查找]的注意事项 三.举例详解[二分查找] 前言 一.[二分查找]步骤 二.[ ...
- java 二分查找算法
编程之美在于算法之美,先来看看二分查找的算法: 隐藏条件:二分查找必须是有序的,从小到大,或从大到小的排序才能进行二分查找,下面来看看代码: package com.cn.daming;public ...
最新文章
- 快速通过nginx配置域名访问
- matlab zeros(12 1),Matlab中 函数zeroS(1,8) 代表什么意思??
- delphi 搭建安卓开发环境
- Android 使用intent.putExtra实现Activity之间的参数传递
- java获取http状态码_java获取Json和http状态码
- python编辑器_资深程序员:学Python我推荐你用这几款编辑器
- 企业管理系统原型、HRM、工作报告统计、0A、商机、合同、客户管理、产品管理、企业oa、行政办公系统、数据报表、销售分析、客户分析、产品管理、人力资源管理系统、crm、axure原型、rp源文件
- 从盒子到“云”——让用户享受更轻松的应用交付
- 深入浅出Python——Python基础语法全解
- [复变函数]第20堂课 5.4 整函数与亚纯函数的概念
- java netbeans 控制台乱码_Netbeans 输出窗口乱码
- 回声状态网络(ESN)对MNIST手写数字集识别
- 2022 年前面试总结与感悟分享
- 数据结构和算法(Java),上
- 维生素C(抗坏血酸)摄入过多有啥后果?
- 调用百度AI实现人像分割(下)
- 如何使用计算机处理文件,怎么处理电脑的缓存文件
- 《AOIT shader in UE4》
- html中可编辑的表格控件,Editable DataGrid(可编辑表格)
- 在window下修改docker配置文件daemon.json
热门文章
- ProteusPro(EDA工具软件) V8.9 _下载及安装
- sqlserver 当月、 时间_SQLServer取系统当前时间
- 数据库 SQL 查询当前时间
- C语言贪吃蛇完整代码
- java 项目视频教程_JAVA视频教程,真实项目,项目实战
- 易语言webservice接口_易语言webservice接口调用助
- vss2005使用手册
- [网络安全自学篇] 八十四.《Windows黑客编程技术详解》之VS环境配置、基础知识及DLL延迟加载详解(1)
- 黑客(一):黑客守则
- 设计模式系列2-设计模式分类及23种设计模式中英文名称对照