二分查找

  • 引言
  • 什么是二分
    • 二分的定义及二分查找算法的思路
      • 二分定义
      • 二分查找算法的思路
    • 二分查代码具体实现
      • 伪代码
      • 实现代码

引言

假如给你一个有序数组,然后给你一个数,让你去数组中找出该元素。如果数组中存在该元素,则返回该数在数组中的下标,如果不存在则返回-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二分查找算法详解相关推荐

  1. 二分查找算法详解(附代码)

    二分查找算法详解(附代码) 注: 现有一个升序 不重复的数组 查询target是否在此数组中并返回序号 使用条件 使用二分算法的两个条件: 有序 不重复 混淆处 二分算法两种方式容易弄混淆的地方:就是 ...

  2. 二分查找算法详解(经典二分和左右边界查找)

    目录 二分查找算法 1. 二分查找算法框架 2. 经典二分查找算法 问题1. 为什么while循环中使用<=号而不是用<号,右边区间right为什么要对数组大小减一? 问题2. 为什么 l ...

  3. python实现二分查找代码+详解

    python实现二分查找代码+详解 一.规定函数值 函数输入值 li=[1,2,3,4,5,6,7,8,9]#输入的集合 val=4#要查找的值 函数内部值 left=0#代表集合中第一个值的位置 r ...

  4. Java 二分查找算法及效率比较

    1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值 ...

  5. 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...

  6. java的数组查找算法_java数组、排序算法、查找算法详解

    1.为什么定义数组要采用type[] arrayName;这种方式? 因为这种方式具有很好的可读性,使用这种方式很容易就可以理解这是定义一个变量,其中变量名是arrayName,变量的类型是type[ ...

  7. Python二分查找/折半查找算法详解--(面试常考)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究)   二分查找也称折 ...

  8. Java垃圾回收算法详解

    1 概述 在前一篇文章中讲到了Java虚拟机的基础知识和运行时数据区的划分,在运行时数据区的划分中,可分为线程共享区域和线程私有区域,而Java的垃圾回收就发生在线程共享区域中,更直观的说法就是Jav ...

  9. C语言【二分查找】详解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 二分 文章目录 前言 一.[二分查找]的步骤 二.[二分查找]的注意事项 三.举例详解[二分查找] 前言 一.[二分查找]步骤 二.[ ...

  10. java 二分查找算法

    编程之美在于算法之美,先来看看二分查找的算法: 隐藏条件:二分查找必须是有序的,从小到大,或从大到小的排序才能进行二分查找,下面来看看代码: package com.cn.daming;public ...

最新文章

  1. 快速通过nginx配置域名访问
  2. matlab zeros(12 1),Matlab中  函数zeroS(1,8) 代表什么意思??
  3. delphi 搭建安卓开发环境
  4. Android 使用intent.putExtra实现Activity之间的参数传递
  5. java获取http状态码_java获取Json和http状态码
  6. python编辑器_资深程序员:学Python我推荐你用这几款编辑器
  7. 企业管理系统原型、HRM、工作报告统计、0A、商机、合同、客户管理、产品管理、企业oa、行政办公系统、数据报表、销售分析、客户分析、产品管理、人力资源管理系统、crm、axure原型、rp源文件
  8. 从盒子到“云”——让用户享受更轻松的应用交付
  9. 深入浅出Python——Python基础语法全解
  10. [复变函数]第20堂课 5.4 整函数与亚纯函数的概念
  11. java netbeans 控制台乱码_Netbeans 输出窗口乱码
  12. 回声状态网络(ESN)对MNIST手写数字集识别
  13. 2022 年前面试总结与感悟分享
  14. 数据结构和算法(Java),上
  15. 维生素C(抗坏血酸)摄入过多有啥后果?
  16. 调用百度AI实现人像分割(下)
  17. 如何使用计算机处理文件,怎么处理电脑的缓存文件
  18. 《AOIT shader in UE4》
  19. html中可编辑的表格控件,Editable DataGrid(可编辑表格)
  20. 在window下修改docker配置文件daemon.json

热门文章

  1. ProteusPro(EDA工具软件) V8.9 _下载及安装
  2. sqlserver 当月、 时间_SQLServer取系统当前时间
  3. 数据库 SQL 查询当前时间
  4. C语言贪吃蛇完整代码
  5. java 项目视频教程_JAVA视频教程,真实项目,项目实战
  6. 易语言webservice接口_易语言webservice接口调用助
  7. vss2005使用手册
  8. [网络安全自学篇] 八十四.《Windows黑客编程技术详解》之VS环境配置、基础知识及DLL延迟加载详解(1)
  9. 黑客(一):黑客守则
  10. 设计模式系列2-设计模式分类及23种设计模式中英文名称对照