Java常用算法-二分查找算法(两种方法实现)
1、二分法查找元素的方式又叫做折半查找,从数组中查找,而且数组是已经按照升序或者降序排列好的,如果数组的元素是无序的则不能使用二分法查找。
比如说我们有一个数组,这个数组有100万个元素,此时我们有一个需求:得到了一个数据,要判断这个数组中是否有这个数据,如果有则返回对应的下标索引,如果没有就返回-1。
二分查找算法要实现这个需求有两种方案可选,一种就是循环查找,一种就是递归法查找。
2、二分查找要求:
(1)必须采用顺序存储结构
(2).必须按关键字大小有序排列。
3、二分查找优缺点:
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
一、循环方法实现二分查找
/**
* 二分查找,返回该值第一次出现的位置(下标从 0 开始)
* @param nums 查询数组
* @param start 开始下标
* @param end 结束下标
* @param findValue 要查找的值
*/
public class BinarySearch {public static void main(String[] args) {int[] nums = {1, 2, 6, 15, 18, 20, 25, 27, 35, 40, 45, 56, 62, 78, 88};int findValue = 35;int binaryResult = binarySearch(nums, 0, nums.length - 1, findValue);System.out.println("元素第一次出现的位置(从0开始):" + binaryResult);}public static int binarySearch(int[] nums, int start, int end, int findValue) {while (start <= end) {int middle = (start + end) / 2;if (findValue == nums[middle]) {//查找值等于中间值直接返回return middle;} else if (findValue < nums[middle]) {//小于中间值,在中间值之前的数据中查找end = middle - 1;} else {//大于中间值,在中间值之后的数据中查找start = middle + 1;}}return -1;} }
执行结果如下:
二、递归实现二分查找
/**
* 二分查找,返回该值第一次出现的位置(下标从 0 开始)
* @param nums 查询数组
* @param start 开始下标
* @param end 结束下标
* @param findValue 要查找的值
*/
public class BinarySearch {public static void main(String[] args) {int[] nums = {1,2,6,15,18,20,25,27,35,40,45,56,62,78,88};int findValue = 25;int binaryResult = binarySearch(nums,0,nums.length-1,findValue );System.out.println("元素第一次出现的位置(从0开始):" + binaryResult);}private static int binarySearch(int[] nums, int start, int end, int findValue) {if(start <= end){int middle = (start + end) / 2;int middleValue = nums[middle];//中间值if (findValue == middleValue){//查找值等于中间值直接返回return middle;}else if (findValue < middleValue){//小于中间值,在中间值之前的数据中查找return binarySearch(nums,start,middle-1, findValue);}else{//大于中间值,在中间值之后的数据中查找return binarySearch(nums,middle+1,end, findValue);}}return -1;} }
执行结果如下:
Java常用算法-二分查找算法(两种方法实现)相关推荐
- Java中的string定义的两种方法和区别
java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...
- java 常用四舍五入保留小数点后两位方法
java 常用四舍五入保留小数点后两位方法 1 . Math.round double num = Math.round(5.2544555 * 100) * 0.01; System.out.pri ...
- Java生成二维码的两种方法
本文介绍Java生成二维码的两种方法,这两种方法都依赖于google提供的二维码依赖包. 一种是自己写工具类,代码可以网上抄. 另一种是使用hutool第三方工具类的依赖包,不用自己抄代码. 一.自定 ...
- [算法]二分查找算法
[思想] 二分搜索主要解决的问题是确定排序后的数组x[0,n-1]中是否包含目标元素target. 二分搜索通过持续跟踪数组中包含元素target的范围(如果target存在数组中的话)来解决问题. ...
- 我的世界java版怎么找史莱姆区块_我的世界手机版史莱姆区块查找的两种方法...
大家好,我是拾方. 大家在玩我的世界的时候,经常为一些材料而发愁,去收集又比较浪费时间,所以就有了一些"农场"存在.比如我们在做一些红石装置的时候,经常需要粘液球,前期只能去一些沼 ...
- Java 跨平台获取 MAC 地址的两种方法
前言 有时我们因为软件授权或者其它需要获取主机唯一标识而需要获取用户主机的MAC地址,而本文则将介绍如何通过Java来实现跨平台获取MAC地址的两种方法,同时具体的代码也已上传到GitHub. 如果不 ...
- java对文件进行压缩的两种方法
在工作中,我们或多或少都会接触到文件的压缩和解压,在window系统中,我们只需下载一个能对文件进行解压缩的应用即可,但如果让我们自己动手写对文件压缩的代码,顿时就头大了. 在java中,我们都知道输 ...
- Java实现条件性参加会议问题(两种方法)
有人邀请A,B,C,D,E,F 6个人参加一项会议,这6个人有些奇怪,因为他们有很多要求,已知: 1)A,B两人至少有1人参加会议: 2)A,E,F 3人中有2人参加会议: 3)B和C两人一致 ...
- 十大排序算法之快速排序(两种方法)
十大排序算法之快速排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小的元素移动到分割元素左侧位置:将待排序序列中所 ...
- C++ 语言基础 —— STL —— 算法 —— 二分查找算法
STL 中,在 <algorithm> 头文件里提供了两个利用二分查找的方法在一个排好序的数组中进行查找. 在一个从小到大的排好序的数组中: lower_bound(begin,end,n ...
最新文章
- (多图) 基于Verilog HDL的FIR数字滤波器设计与仿真
- 一分钟了解ArrayList和Vector的区别
- 手机耗电统计app_教你 6 招,解决 iOS13 耗电问题
- 表的插入、更新、删除、合并操作_20_通过表关联删除多张表
- 如何实现一套可切换的声网+阿里的直播引擎
- 视觉开发需要什么程度的数学_角度的概念在视觉上非常直观,但其数学定义并不是那么简单...
- P2672-推销员【贪心】
- Hibernate之必须导入jar包
- shell变量$$,$!,$?,$*,$0,$1,$#,$@的含义解释
- oppo r9 android7.0,OPPO R9 Plus的手机系统是什么
- axios+vue+springboot完成批量删除
- 计算机网络毕业论文 20页,计算机网络技术专业毕业论文(23页)-原创力文档
- 关于C#中枚举与字符串与数字之间的转换
- Unity使用UniWebview插件内嵌H5游戏
- 5G及移动边缘计算(MEC)学习笔记(2)
- 访问网络计算机提示0 80070035,win7访问局域网共享文件出现 0x80070035错误的解决办法...
- 这么简单!安卓手机投屏到电脑的神器
- 别乱说,算法才不是脑筋急转弯
- The Development of Han Chinese’s Cuisine and Diet
- 【linux】循序渐进学运维-基础篇-文件的软硬链接