hello,大家好!我是磨磨唧唧小蘑菇~

最近在努力的复习一些基本的算法,本期就以java的二分查找算法进行详细的概述(之前面试的时候,手写算法被坑过,一把泪啊)。进入正题吧~

目录

一、二分查找算法的介绍

二、二分查找算法的思路分析

三、二分查找算法的实例

一、二分查找算法的介绍

二分查找,又名折半查找。顾名思义,一半一半去找目标值~

对于一个有序的升序列表,将目标值与表中间的值进行对比:

1)如果目标值与表中间的值相等,则直接返回表中间的值即可

2)如果目标值与表中间的值不相等,则将两者进行大小比较,从而分成两个表:

(1)如果目标值小于中间值,说明目标值在中间值往左的表中,故舍弃中间值往右的表,重新二分查找中间值往左的表

(2)如果目标值大于中间值,说明目标值在中间值往右的表中,故舍弃中间值往左的表,重新二分查找中间值往右的表

最后,重复以上过程,直到找到目标值为止;或直到子表不存在为止,此时为查找不成功

二、二分查找算法的思路分析

1)首先确定有序的升序列表的中间值是多少

即:mid = (left+right)/2        //中间值的下标

2)将目标值target与表中间的值arr[mid]进行比较:

即:如果target = arr[mid],说明目标值与arr[mid]相等,找到了目标值

如果target < arr[mid],说明目标值在arr[mid]的左边,因此需要接着二分查找左边的表

如果target > arr[mid],说明目标值在arr[mid]的右边,因此需要接着二分查找右边的表

Attention:什么时候需要结束呢?

1)找到目标值就结束

2)查找完整个数组,如果依然没有找到目标值,也需要结束

3)当left > right,则直接退出

三、二分查找算法的实例

eg:给你一个有序的升序数组,再给你一个目标值,请在数组中找到对应的目标值并返回它的下标

1、非递归算法实现:

package com.java.basic.array;/*** @Author wangchuanmin* @Date 2021/9/1 17:35*/import java.util.Arrays;
/*** 二分查找算法*/
public class BinarySearch {/*** 二分查找算法第一种:有序数组中没有重复的目标值(目标值是唯一的)---非递归* @param target* @param nums* @return*/// 非递归实现public int binarySearch1(int target, int[] nums) {int left = 0;int right = nums.length-1;  //取最后一个下标int mid = 0;if (left > right || nums.length == 0 || nums == null) { //左下标大于右下标,直接返回-1return -1;}while (left <= right) { //初始化 right 的赋值是 nums.length - 1,即最后一个元素的索引,而不是 nums.lengthmid = (left + right)/2; //如果下标之和除以2有小数,则直接去掉0.5if (target == nums[mid]) {return mid; //找到目标值,然后返回} else if (target > nums[mid]) {    //目标值大于中间值,向右遍历left = mid + 1; //所以向右遍历的第一个下标是:中间下标+1} else if (target < nums[mid]) {    //目标值小于中间值,向左遍历right = mid - 1;    //所以向左遍历的最后一个下标是:中间下标-1}}return -1;  //找不到对应目标值,直接返回-1}public static void main(String[] args) {BinarySearch bSearch = new BinarySearch();int target = 9;int[] nums = new int[]{9,3,4,6,8};Arrays.sort(nums);System.out.println("排序后的nums为:" + Arrays.toString(nums));int result = bSearch.binarySearch1(target,nuns);System.out.println("非递归算法,目标" + target + "的下标是:" + result);}
}

运行结果如下:

排序后的nums为:[3, 4, 6, 8, 9]
非递归算法,目标9的下标是:4Process finished with exit code 0

2、递归算法实现:

package com.java.basic.array;/*** @Author wangchuanmin* @Date 2021/9/1 17:35*/import java.util.Arrays;
/*** 二分查找算法*/
public class BinarySearch {/*** 二分查找算法第二种:有序数组中没有重复的目标值(目标值是唯一的)---递归* @param target* @param nums* @param left* @param right* @return*/public int binarySearch2(int target, int[] nums, int left, int right) {int mid = (left + right)/2;if (nums.length == 0 || nums == null || left > right) {return -1;}while (left <= right) {if (target == nums[mid]) {return mid;} else if (target < nums[mid]) {return binarySearch2(target, nums, left, mid - 1);} else if (target > nums[mid]) {return binarySearch2(target, nums, mid + 1, right);}}return -1;}public static void main(String[] args) {BinarySearch bSearch = new BinarySearch();int target = 8;int[] nums = new int[]{9,3,4,6,8};Arrays.sort(nums);System.out.println("排序后的nums为:" + Arrays.toString(nums));int result1 = bSearch.binarySearch2(target, nums, 0, nums.length-1 );System.out.println("递归算法,目标" + target + "的下标是:" + result1);}
}

运行结果如下:

排序后的nums为:[3, 4, 6, 8, 9]
递归算法,目标8的下标是:3Process finished with exit code 0

以上的两种方法,仅适用于“目标值是唯一”。如果相同目标值有多个的话,就不适用啦~(目前还没想明白,如果有多个目标值的时候,该怎么办?)哎,真是苦恼呢QAQ

好啦,到这里java的二分查找算法就结束啦~欢迎交流;-)

【java算法】二分查找算法详解相关推荐

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

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

  2. [算法]二分查找算法

    [思想] 二分搜索主要解决的问题是确定排序后的数组x[0,n-1]中是否包含目标元素target. 二分搜索通过持续跟踪数组中包含元素target的范围(如果target存在数组中的话)来解决问题. ...

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

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

  4. Java实现二分查找算法

    二分查找(binary search),也称折半搜索,是一种在 有序数组 中 查找某一特定元素 的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元 ...

  5. 快速排序和二分查找时间复杂度详解

    因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:一次二分剩下:n/2两次二分剩下:n/2/2 = n/4...m次二分剩下:n/(2^m)在最坏情况下是在排除到只剩下最后一个值之后得到结 ...

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

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

  7. C++ 语言基础 —— STL —— 算法 —— 二分查找算法

    STL 中,在 <algorithm> 头文件里提供了两个利用二分查找的方法在一个排好序的数组中进行查找. 在一个从小到大的排好序的数组中: lower_bound(begin,end,n ...

  8. 34. 在排序数组中查找元素的第一个和最后一个位置012(二分查找+思路+详解+两种方法)Come Baby!!!!!!!! !

    一:题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返回 [-1, -1]. 进阶: 你 ...

  9. 81. 搜索旋转排序数组 II(014)二分查找+思路+详解+二种做法

    一:题目 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 ...

  10. 33. 搜索旋转排序数组(013)二分查找+思路详解+来干了这杯代码!!!!!!

    一:题目 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变 ...

最新文章

  1. rwkj 1422搜索(素数环)
  2. [JVM]线上CPU负载持续飙高的问题解决
  3. 字节跳动践行节能减排,数据中心能效居行业前列
  4. postmessage与sendmessage的区别
  5. leetcode面试题 10.03. 搜索旋转数组(二分法)
  6. Dojo1.6 中的事件处理
  7. AO3414相关技术资料
  8. Spring_Mybatis整合实现CRUD操作
  9. java 堆_Java 对象都是在堆上分配内存吗?
  10. C 语言的32 个关键字意义
  11. [数据仓库]数据仓库建模的目标
  12. spring MVC 使用 modelAndView.setViewName(forward:*.action) 发送重定向
  13. 华为NP课程笔记12-组播
  14. linux阅读文件格式,Linux下安装boox viewer阅读pdg格式文件
  15. pmon构建过程分析
  16. 计算机上无开根号功能 怎么计算机,攻略:2019年中级会计师无纸化考试 计算器怎么开根号?...
  17. 手算平方根的JavaScript实现,并推广至任意次方根
  18. 制作3D实时交互影像产品,需要用到的技术和软件!
  19. 外行转it_外行人员的微服务容器
  20. java华氏温度与摄氏度的互相转换

热门文章

  1. 手机当启动U盘DriveDroid 版本 0.10.3 功能无限制版使用教程
  2. PHP佳音高清图片上传下载源码
  3. 学习笔记:SSH端口转发的三种方式
  4. 可添加离线地图的手机GIS软件NextGIS(附安装包下载)
  5. SQL Server 启动错误 系统找不到指定的文件/路径
  6. html5输入框点击后消除高光,请问(VR渲染)光域网的灯光怎么把“高光”去掉?...
  7. 3Dmax读取丢失的贴图的方法
  8. Java高级工程师学习要求
  9. CSDN 博客版块问题解决日志
  10. 网页回到顶部的js代码实现