Java实现二分法的案例,什么是二分法

文章目录

  • Java实现二分法的案例,什么是二分法
    • 二分法
      • 实现

Java实现二分法的案例,什么是二分法

二分法

概念:

  • 二分法(Bisection method) 即一分为二的方法,又叫折半查找方法。
  • 把一组有序数列分为左右两部分,从这组数字的中间位置开始找:
  • 如果中间位置的数等于目标数,则直接返回;
  • 如果中间位置的数大于目标数,则从左边部分查找;
  • 如果小于目标数,则从右边部分查找;
  • 重复以上过程,直到找到满足条件的记录,使查找成功。

时间复杂度:
都是 O(log2 N)

空间复杂度:
非递归方式: 空间复杂度是O(1);
递归方式: 空间复杂度:O(log2N )

实现

1. 递归方式

 public static int binarySearchRecursive(int[] arr, int low, int high, int key) {//边界条件:如果目标数没有在数组范围内(即比最左边的数小,比最右边的数大)if (arr == null || arr.length == 0 || arr[low] > key || arr[high] < key || low > high) {return -1;}// 获取中间位置下标int mid = (low + high) / 2;// 将中间位置的数和目标数作比较,如果中间位置的数等于目标数,则直接返回下标,// 如果中间位置的数大于目标数,则将左边部分用递归方法继续查找;如果小于目标数,则从右边部分用递归方法继续查找if (arr[mid] == key) {return mid;} else if (arr[mid] > key) {return binarySearch(arr, low, mid - 1, key);} else {return binarySearch(arr, mid + 1, high, key);}}// 测试下:从一组数中找3,输出数组下标public static void main(String[] args) {int[] arr = {2, 3, 5, 7, 9, 78, 90, 167};System.out.println(binarySearchRecursive(arr, 0, (arr.length) - 1, 3));}

2. 非递归方式

 public static int binarySearch(int[] arr, int key) {int low = 0;int high = arr.length - 1;while (low <= high) {int middle = (low + high) / 2;if (key < arr[middle]) {high = middle - 1;} else if (key > arr[middle]) {low = middle + 1;} else {return middle;}}return -1;}// 测试下:从一组数中找3,输出数组下标public static void main(String[] args) {int[] arr = {2, 3, 5, 7, 9, 78, 90, 167};System.out.println("数组下标:"+binarySearch(arr, 3));}

3.非递归

/*** 二分查找* @param srcArray 源数组* @param des 目标元素* @return 如果找到则返回索引位置,找不到则返回-1*/
public static int binarySearch(int[] srcArray, int des) {//定义初始最小、最大索引int start = 0;int end = srcArray.length - 1;//确保不会出现重复查找,越界while (start <= end) {//计算出中间索引值  >>> 逻辑右移 也就是 int middle = (end + start)/2int middle = (end + start)>>>1 ;//防止溢出if (des == srcArray[middle]) {return middle;//判断下限} else if (des < srcArray[middle]) {end = middle - 1;//判断上限} else {start = middle + 1;}}//若没有,则返回-1return -1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前程无忧接口分析

前程无忧接口分析 所需用到的工具URL解析通过抓包软件或者开发者选项抓取数据包对代码中的参数解析分析对acw_sc__v2进行分析对acw_sc__v2进行转换代码生成生成outPutList数组生成arg2参数生成arg3参数最终的效果 对详情页面的分析对timestamp__1258的生成分析 所需用到的工具 …

Vue3.0优点详解

相对于Vue2.0 3.0有了比较大的改进&#xff0c;优势主要有以下几点&#xff1a; 一、性能提升 1、Vue3.0的响应式系统使用了Proxy代理对象&#xff0c;取代了Vue2.0中的Object.defineProperty&#xff0c;使得Vue3.0的响应式系统更快、更灵活。 2、Vue3.0对TypeScript的支持更…

Ubuntu22.04安装完成后便可直接使用键盘上的Print键进行截图

概要&#xff1a;Ubuntu22.04安装完成后&#xff0c;无需安装什么截图软件&#xff0c;可以直接使用键盘上的Print键进行截图。 1、按一下Print键 我的电脑上Print键是PrtSc&#xff0c;如下图所示 2、框选区域并截图 如下图中&#xff0c;可以框选(Selection)&#xff0c;也…

【教学类-35-06】17号的学号字帖延伸出的全体字帖(1-9去0)(A4竖版1份)

作品展示 背景需求&#xff1a; 给大4班17号同学单独做了一个学号字帖后&#xff0c;我想可以把这样的学具用在中班&#xff08;我马上要成为中4班老师了&#xff09;&#xff0c;那就需要给全班做一份这样的大号学号贴。 使用17号同学的word模板&#xff08;见下文&#xff…

3dMax vs Cinema4d哪个更好更适合你?

Cinema 4d和3dMax的区别 用于游戏风格、开发和风格可视化的3D建模、动画和渲染软件系统&#xff0c;为用户提供制作和编辑动画、视觉效果和环境的灵活性。4D CINEMA可能是由MAXON构建的强大的3D建模、运动图形、绘画和动画软件系统。Cinema 4D将在每个Windows和MAC操作系统上运…

多目标追踪评价指标

多目标追踪性能评价 基础&#xff1a; GT&#xff1a;Ground Truth&#xff0c;是指真实的标签或者真实的对象&#xff1b; TP&#xff1a;True Positive&#xff0c;被正确预测检测到的样本&#xff1b; TN&#xff1a;True Negative&#xff0c;被预测为负的负样本&#…

啃下这50道笔试题,你就是SQL专家!(附答案,收藏备用)

【关注微信公众号&#xff1a;跟强哥学SQL&#xff0c;回复“笔试”免费领取大厂SQL笔试题。】 有两个名为Department&#xff08;部门&#xff09;和Employees&#xff08;员工&#xff09;的表结构如下&#xff1a; CREATE TABLE Department ( DepId int, DepName va…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑两阶段鲁棒优化配置的多微网合作博弈》

这个标题涉及到多个概念&#xff0c;让我们逐步解读&#xff1a; 考虑两阶段鲁棒优化配置&#xff1a; 两阶段&#xff1a; 指的是在解决问题或进行优化时&#xff0c;可能存在两个不同的阶段或步骤。这表明问题的解决不是一步完成的&#xff0c;而是需要经过多个步骤或阶段。鲁…

前端学习系列之CSS

目录 CSS 简介 发展史 优势 基本语法 引用方式 内部样式 行内样式 外部样式 选择器 id选择器 class选择器 标签选择器 子代选择器 后代选择器 相邻兄弟选择器 后续兄弟选择器 交集选择器 并集选择器 通配符选择器 伪类选择器 属性选择器 CSS基本属性 优…

virtualenv创建虚拟环境

目录 概念安装创建虚拟环境激活虚拟环境删除虚拟环境退出虚拟环境更改虚拟环境路径概念 virtualenv是一个创建隔离的Python运行环境的工具。它允许用户为每个Python项目创建一个独立的虚拟环境,以避免不同项目之间的依赖冲突。 安装 pip install virtualenv virtualenvwrapper…

JS如何实现竖屏轮播图

首先是HTML搭建结构 <div class"banner-box"><div class"bannerbox"><div class"banner"><a class"a-img-ban"> <img class"img-ban" src"./img/640 (4).jpg" alt"终于等到你还…

SpringBoot项目访问resources下的静态资源

1.新建一个配置文件夹&#xff0c;放配置类 2.编辑 WebMvcConfig.java package com.southwind.configuration;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import or…

openlayers地图使用---跟随地图比例尺动态标绘大小的一种方式3

openlayers地图使用—跟随地图比例尺动态标绘大小的一种方式 预期&#xff1a;随着地图比例尺放大缩小&#xff0c;地图上的标绘随着变化尺寸 思路&#xff1a;通过VectorImage和动态修改Feature尺寸实现Feature跟随地图比例尺尺寸变化 优点&#xff1a;结合第1和第2种方式的…

openlayers地图使用---跟随地图比例尺动态标绘大小的一种方式2

openlayers地图使用—跟随地图比例尺动态标绘大小的一种方式2 预期&#xff1a;随着地图比例尺放大缩小&#xff0c;地图上的标绘随着变化尺寸 思路&#xff1a;通过不断添加地图图层实现标绘的动态缩放 优点&#xff1a;标绘放大缩小非常流畅 缺点&#xff1a;标绘超过1000…

LangChain 22 LangServe用于一键部署LangChain应用程序

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

等待和通知

引入 由于线程是抢占式执行的,因此线程之间的执行的先后顺序难以预知 但是实际开发中我们希望合理协调多个线程之间执行的先后顺序. 这里的干预线程先后顺序,并不是影响系统的调度策略(内核里调度线程,仍然是无序调度). 就是相当于在应用程序代码中,让后执行的线程主动放弃被…

3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案

在 5G、云计算等技术飞速发展的加持下&#xff0c;云渲染技术迎来了突飞猛进的发展。在这样的背景下&#xff0c;3DCAT应运而生&#xff0c;成为了业内知名的实时云渲染服务商之一。 交互式3D实时云看车作为云渲染技术的一种使用场景&#xff0c;也逐步成为一种新的看车方式&a…

设备温度和振动综合监测:温振一体式传感器的优点和应用

随着工业设备的复杂性和自动化程度的提高&#xff0c;对设备状态监测的需求也日益增加。温振一体式传感器作为一种集振动和温度监测于一体的传感器&#xff0c;具备多项优势&#xff0c;因此在工业设备状态监测领域得到广泛应用。 温振一体式传感器基于振动传感器和温度传感器的…

1380 一笔画问题

如果一个无向图存在一笔画&#xff0c;则一笔画的路径叫做欧拉路&#xff0c;如果最后又回到起点&#xff0c;那这个路径叫做欧拉回路。 #include<bits/stdc.h> using namespace std; #define N 510 int g[N][N],d[N],c[N],n,m,reckon,oddity_point,lt; void dfs(int i)…

网络运维与网络安全 学习笔记2023.12.1

网络运维与网络安全 学习笔记 第三十二天 今日目标 ACL原理与类型、基本ACL配置、高级ACL配置 高级ACL之ICMP、高级ACL之telnet ACL原理与类型 项目背景 为了企业的业务安全&#xff0c;要求不同部门对服务器有不同的权限 PC1不能访问Server PC2允许访问Server 允许其他所…