java实现二分查找-两种方式

【从零学习经典算法系列】分治策略实例——二分查找 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn)。 阅读详情

原文:https://blog.youkuaiyun.com/maoyuanming0806/article/details/78176957


二分查找是一种查询效率非常高的查找算法。又称折半查找。

起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来辅助查询。本文就介绍两种方法


二分查找算法思想


有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。


一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。



二分查找图示说明


图片来源百度图片,感谢分享者


二分查找优缺点


优点是比较次数少,查找速度快,平均性能好;

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。



使用条件:查找序列是顺序结构,有序。



java代码实现

使用递归实现

[java]  view plain  copy
  1. /** 
  2.  * 使用递归的二分查找 
  3.  *title:recursionBinarySearch 
  4.  *@param arr 有序数组 
  5.  *@param key 待查找关键字 
  6.  *@return 找到的位置 
  7.  */  
  8. public static int recursionBinarySearch(int[] arr,int key,int low,int high){  
  9.       
  10.     if(key < arr[low] || key > arr[high] || low > high){  
  11.         return -1;                
  12.     }  
  13.       
  14.     int middle = (low + high) / 2;          //初始中间位置  
  15.     if(arr[middle] > key){  
  16.         //比关键字大则关键字在左区域  
  17.         return recursionBinarySearch(arr, key, low, middle - 1);  
  18.     }else if(arr[middle] < key){  
  19.         //比关键字小则关键字在右区域  
  20.         return recursionBinarySearch(arr, key, middle + 1, high);  
  21.     }else {  
  22.         return middle;  
  23.     }     
  24.       
  25. }  

不使用递归实现(while循环)

[java]  view plain  copy
  1. /** 
  2.  * 不使用递归的二分查找 
  3.  *title:commonBinarySearch 
  4.  *@param arr 
  5.  *@param key 
  6.  *@return 关键字位置 
  7.  */  
  8. public static int commonBinarySearch(int[] arr,int key){  
  9.     int low = 0;  
  10.     int high = arr.length - 1;  
  11.     int middle = 0;         //定义middle  
  12.       
  13.     if(key < arr[low] || key > arr[high] || low > high){  
  14.         return -1;                
  15.     }  
  16.       
  17.     while(low <= high){  
  18.         middle = (low + high) / 2;  
  19.         if(arr[middle] > key){  
  20.             //比关键字大则关键字在左区域  
  21.             high = middle - 1;  
  22.         }else if(arr[middle] < key){  
  23.             //比关键字小则关键字在右区域  
  24.             low = middle + 1;  
  25.         }else{  
  26.             return middle;  
  27.         }  
  28.     }  
  29.       
  30.     return -1;      //最后仍然没有找到,则返回-1  
  31. }  

测试

测试代码:

[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.   
  3.     int[] arr = {1,3,5,7,9,11};  
  4.     int key = 4;  
  5.     //int position = recursionBinarySearch(arr,key,0,arr.length - 1);  
  6.       
  7.     int position = commonBinarySearch(arr, key);  
  8.   
  9.               if(position == -1){  
  10.         System.out.println("查找的是"+key+",序列中没有该数!");  
  11.     }else{  
  12.         System.out.println("查找的是"+key+",找到位置为:"+position);  
  13.     }  
  14.       
  15. }  

recursionBinarySearch()的测试:key分别为0,9,10,15的查找结果

[java]  view plain  copy
  1. 查找的是0,序列中没有该数!  
  2.   
  3. 查找的是9,找到位置为:4  
  4.   
  5. 查找的是10,序列中没有该数!  
  6.   
  7. 查找的是15,序列中没有该数!  

commonBinarySearch()的测试:key分别为-1,5,6,20的查找结果

[java]  view plain  copy
  1. 查找的是-1,序列中没有该数!  
  2.   
  3. 查找的是5,找到位置为:2  
  4.   
  5. 查找的是6,序列中没有该数!  
  6.   
  7. 查找的是20,序列中没有该数!  


时间复杂度

采用的是分治策略

最坏的情况下两种方式时间复杂度一样:O(log2 N)


最好情况下为O(1)


空间复杂度

  算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数

非递归方式:
  由于辅助空间是常数级别的所以:
  空间复杂度是O(1);

递归方式:

 递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:
 空间复杂度:O(log2N )



【分治算法2.3】 二分搜索技术(C++实现) 算法设计与分析【二分搜索技术】 阅读详情

相关推荐

基于springboot医院医疗仪器管理系统

基于Spring Boot的医院医疗仪器管理系统是一款专门为医院设计的高效管理工具。

2201_75927219的博客 1012

二分查找思想及其代码实现

二分查找法学习

qq_31830173的博客 185

Kaggle时间序列竞赛金牌方案解析与实战指南

本文深度解析了Kaggle时间序列竞赛的金牌方案,揭示了其成功不仅依赖先进模型,更在于系统工程思维。文章系统阐述了从数据理解、特征工程到模型集成与后处理的全流程,并重点剖析了分层建模、自定义损失函数、时序交叉验证等核心技巧,为参赛者提供了从理论到实战的完整指南。

weixin_29196315的博客 355

分治--二分查找(JAVA)

问题描述: 给定一个已经按从大到小排好序的数组 arr,数组 arr 中包含 n 个元素,在数组中检索指定元素 x,并返回该元素在数组中的下标,如果没找到返回 -1。 分治思想: 充分利用元素之间的次序关系,将 n 个元素分成个数大致相同的两半,取数组元素 arr[n/2] 与 x 进行比较,会出现如下3种结果: arr[n/2] = x ,则找到 x,此时为终止条件,算法终止; arr[n/2] > x ,则只要在数组 arr 的左半部分继续搜素 x; arr[n/2] < x ,则只要在数

why20010602的博客 907

【Ragflow】9.问答为什么比搜索响应慢?从源码角度深入分析

前几天看到有群友提到一个现象:Ragflow的搜索界面的问答速度很快,但聊天界面的问答速度很慢,究竟是什么原因?在深入挖掘源码之后,逐渐发现了问题的答案。

兴趣使然的创作者 2898

SAP成本核算变式OKKN配置详解:从CK11N到CK24,手把手教你搞定标准成本发布

本文深入解析SAP成本核算变式OKKN的配置原理与实战应用,涵盖从CK11N到CK24的标准成本发布全流程。详细讲解数量结构控制、价值结构配置及间接费用计算规则,帮助成本会计精准掌握标准成本计算逻辑,解决BOM版本选择、工艺路线获取等常见问题,提升企业成本管理效率。

weixin_27219587的博客 284

二分查找算法的实现-分治策略

所谓分治策略,就是把规模大的问题分成若干个规模小的问题来解决,最后把各自的结果再合并。 它的一般的算法设计模式如下:   Divide-and-conquer(P)    1. if |P|≤n0    2. then return(ADHOc(P))    3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk    4. for i←1 to k    5. do yi ← ...

weixin_33719619的博客 648

基于RK3568的YOLOv11模型端侧推理优化与部署实战指南

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

m0_64661770的博客 115

实现二分查找java_java两种方式实现二分查找

java两种方式实现二分查找1.while循环实现2.递归实现二分查找是什么?​二分查找,又名折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。代码演示package com.ks.binarysearch;...

weixin_35034072的博客 142

增量学习入门:概念、代码示例与应用场景

在当今快速变化的数据环境中,传统的机器学习模型往往需要重新训练以适应新的数据。然而,这种方法不仅耗时耗力,还可能导致模型性能的不稳定。增量学习(Incremental Learning)作为一种新兴的学习范式,能够在新数据到来时动态更新模型,而无需重新训练整个模型。本文将详细介绍增量学习的基本概念、代码示例、应用场景以及需要注意的事项。增量学习作为一种高效的机器学习方法,能够在新数据到来时动态更新模型,具有广泛的应用前景。通过本文的介绍,相信你对增量学习有了初步的了解。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1152

uniapp微信小程序 - 解决输入框input软键盘弹起时页面整体上移问题,页面上推导致顶部出现元素遮挡问题,uniapp软键盘导致页面上移头部内容被错位遮住错乱,让页面头固定在顶部不动不会受影响!

解决uni-app微信小程序底部input输入框,键盘弹起时页面整体上移问题,当键盘弹起时,会导致页面整体上移,页面头固定在顶部不动,微信小程序键盘弹起时,底部输入框抬起至键盘上方,顶部导航栏固定不动,uni-app输入框,输入框在底部;当弹出键盘时,页面整体上移,页面头信息会消失不见,小程序底部input输入框,input组件弹起系统键盘时,键盘会顶住页面导致页面会上移,当键盘弹起时整个页面被挤压,导致元素上移或被覆盖,输入框能自动抬起至键盘上方,顶部导航栏保持固定,不被顶上去,如何解决这个问题,动态高度

✅ 精选推荐文章 1万+

java实现二分查找算法,两种方式实现,非递归和递归

java实现二分查找算法,两种方式实现,非递归和递归 java基础算法 概念:二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 2、二分查找前提 必须采用顺序存储结构。 必须按关键字大小有序排列。 3、二分查找思想 思想:每次去找中间的那个元素比较大小,每次可以减少一半元素比较。 4、二分查找过程 定义最小,...

唐_方的博客 1500

Flutter SDK的删除与重装:一步步教你如何轻松搞定

在Flutter开发过程中,我们可能会遇到一些需要重新安装Flutter SDK的情况,例如升级Flutter版本、解决依赖冲突等。本文将详细介绍如何删除并重新安装Flutter SDK,让你轻松应对各种问题。

理论都是虚的,代码才是王道。 2247

Java实现二分查找的两种方式

Java实现二分查找的两种方式【循环与递归】

qq_63567731的博客 478

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JAVA二分查找法两种实现方式

package test2; //二分查找的前提是数组已经拍好了顺序 public class 二分查找 { //递归实现二分查找 public static int twoSearch(int[] arr,int key,int low,int high){ //判断关键字是否在最小索引low和最大索引high之间,并high>low if(key<arr[low...

码放南山 182

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java实现二分查找-两种方式6_java实现二分查找-两种方式-Go语言中文社区

二分查找是一种查询效率非常高的查找算法。又称折半查找。起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来辅助查询。本文就介绍两种方法二分查找算法思想有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录...

weixin_36486007的博客 105

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

两种方式Java实现二分查找法

小树今天使用递归方法实现了二分查找法,也写了普通的二分查找法,代码如下:import java.util.*;public class BinarySort { public static void main(String[]args){ int A[]={2,32,4,12,22,31,20,45,13,23}; BitSort.bitSort(A);//调

一棵小树 581

java实现二分查找-两种方式6_java实现二分查找-两种方式

二分查找是一种查询效率非常高的查找算法。又称折半查找。起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来辅助查询。本文就介绍两种方法二分查找算法思想有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录...

weixin_32150221的博客 148

二分查找两种实现方式(java实现)

 1    二分查找又叫折半查找:优点是:查找的次数少,查找的速度快,平均性能好。缺点是:要求带查表为有序表,且删除插入困难,因此二分查找适用于不经常变动并且查找频繁的有序列表。2    算法要求:必须采用顺序存储结构,必须按照关键字大小顺序排列。   3    时间复杂度o(logn)4    算法的思想:(1)在有序表中,搜索先从中间的元素开始查找,如果中间的元素等于查找的元素,则查找成功; ...

常庆伟的博客 319

二分查找的两种实现方式(JAVA)

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上

Android developer. 6796

java两种实现二分查找方式

二分查找法适用于 升序排列的数组,如果你所要操作的数组不是升序排序的,那么请用排序算法,排序一下。 说明:使用二分查找法相比顺序查找  节约了时间的开销,但是增加了空间使用。因为需要动态记录 起始索引和结束索引和中间索引。 顺序查找  平均和最坏情况时间复杂度 :O(n)   二分查找法 时间复杂度 为 :O(log2n) package part1; /** * Create...

M_Jack的博客 471
上一篇: JAVA实现单链表快速排序
下一篇: 堆和堆的应用:堆排序和优先队列
还不够
博客等级 码龄16年 113粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值