当前位置: 首页 > news >正文

二分查找算法(全网最详细代码演示)

         二分查找也称 半查找(Binary Search),它时一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字 有序 排列。

 注意:使用二分查找的前提是 该数组是有序的。

在实际开发中,如果对应的索引不存在,我们一般都是返回一个负数,而且经常用   - 1   来表示。

 

请对一个有序数组进行二分查找  { 1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示 “没有这个数” 。

课后思考题:{1,8,10,89,1000,1000,1234} 当一个有序数组中,有多个相同的数组时,如何将所有的数值都查找到,比如这里面的1000。

{ 1,8,10,89,1000,1234 } 

二分查找的思路分析

1、首先确定该数组的中间的下标

mid = (left + right )/  2

2、然后让需要查找的数 findVal 和 arr[mid] 比较

        2.1、findVal > arr[mid] ,说明你要查找的数在 mid 的右边,因此需要 递归 的向右查找

        2.1、findVal < arr[mid] ,说明你要查找的数在 mid 的左边,因此需要 递归 的向左查找

        2.3、findVal < arr[mid],说明找到,就返回

//什么时候我们需要结束递归。

1)找到就结束递归

2)递归完整个数组,仍然没有找到findVal,也需要结束递归  当left >right 就需要退出

  •  请对一个有序数组进行二分查找  { 1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示 “没有   这个数” 。

public class BinarySearch {public static void main(String[] args) {int arr[] = {1, 8, 10, 89, 1000, 1234};int resIndex = binarySearch(arr, 0, arr.length - 1, 88);System.out.println(resIndex);}/*** @param arr   数组* @param left   左边的索引* @param right   右边的索引* @param findVal  要查找的值* @return 如果找到就返回下标,如果没有找到,就返回-1*/public static int binarySearch(int[] arr, int left, int right, int findVal) {//当left > right 时,说明递归整个数组,但是没有找到if (left > right) {return -1;}int mid = (left + right) / 2;int midVal = arr[mid];if (findVal > midVal) { //向右递归return binarySearch(arr, mid + 1, right, findVal);} else if (findVal < midVal) { //向左递归return binarySearch(arr, left, mid - 1, findVal);} else {return mid;}}
}
  • 完成一个课后思考题:{1,8,10,1000,1000,1234}当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1000

思路分析

1、在找到 mid 索引值,不要马上返回

2、向mid索引值的左边扫描,将所有满足1000,的元素的下标,加入到集合ArrayList

3、向mid索引值的右边扫描,将所有满足1000,的元素的下标,加入到集合ArrayList

4、将ArrayList返回

public class BinarySearch1 {public static void main(String[] args) {int arr[] = {1, 8, 10, 89, 1000, 1000, 1000, 1000,1234};List<Integer> resIndexList = binarySearch2(arr, 0, arr.length - 1, 1000);System.out.println(resIndexList);}/*** @param arr     数组* @param left    左边的索引* @param right   右边的索引* @param findVal 要查找的值* @return 如果找到就返回下标,如果没有找到,就返回-1*/public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal) {//当left > right 时,说明递归整个数组,但是没有找到if (left > right) {return new ArrayList<Integer>();}int mid = (left + right) / 2;int midVal = arr[mid];if (findVal > midVal) { //向右递归return binarySearch2(arr, mid + 1, right, findVal);} else if (findVal < midVal) { //向左递归return binarySearch2(arr, left, mid - 1, findVal);} else {ArrayList<Integer> resIndexlist = new ArrayList<Integer>();//向mid索引值的左边扫描,将所有满足1000,的元素的下标,加入到集合ArrayListint temp = mid - 1;while (true) {if (temp < 0 || arr[temp] != findVal) { //退出break;}//否则,就temp放入到resIndexlistresIndexlist.add(temp);temp -= 1; //temp 左移}resIndexlist.add(mid);//向mid索引值的右边扫描,将所有满足1000,的元素的下标,加入到集合ArrayListtemp = mid + 1;while (true) {if (temp > arr.length || arr[temp] != findVal) { //退出break;}//否则,就temp放入到resIndexlistresIndexlist.add(temp);temp += 1; //temp右移}return resIndexlist;}}
}
public class BinarySearch2 {public static void main(String[] args) {int[] array = new int[]{10, 11, 12, 13, 14, 15, 16, 17};int target = 10;int index = search(array, target);System.out.println(index);}public static int search(int[] array, int target) {int min = 0;int max = array.length - 1;while (min <= max) {int mid = (min + max) / 2;if (array[mid] == target) {return mid;}if (array[mid] < target) {min = mid + 1;}if (array[mid] > target) {max = mid - 1;}}return -1;}
}
public class BinarySearch3 {public static void main(String[] args) {int[] arr2 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};int dest1 = 35;int head = 0;  //初始的首索引int end = arr2.length - 1;  //初始的末索引boolean isFlag1 = true;while (head <= end) {int middle = (head + end) / 2;if (dest1 == arr2[middle]) {System.out.println("找到了指定的元素,位置为:" + middle);isFlag1 = false;break;} else if (arr2[middle] > dest1) {end = middle - 1;} else {head = middle + 1;}}if (isFlag1) {System.out.println("很遗憾,没有找到的啦!");}}
}
public class BinarySearch4 {public static void main(String[] args) {int[] arr2 = new int[]{2, 4, 5, 8, 12, 15, 19, 26, 37, 49, 51, 66, 89, 100};int target = 17;int head = 0;  //默认的首索引int end = arr2.length - 1; //默认的尾索引boolean isFlag = false;while (head <= end) {int middle = (head + end) / 2;if (target == arr2[middle]) {System.out.println("找到了" + target + ",对应的位置为:" + middle);isFlag = true;break;} else if (target > arr2[middle]) {head = middle + 1;} else {end = middle - 1;}}if (!isFlag) {System.out.println("不好意思,未找到");}}
}
public class BinarySearch5 {public static void main(String[] args) {int[] arr = {7, 23, 79, 81, 103, 127, 131, 147};System.out.println(binarySearch(arr, 150));}public static int binarySearch(int[] arr, int number) {int min = 0;int max = arr.length - 1;while (true) {if (min > max) {return -1;}int mid = (min + max) / 2;if (arr[mid] > number) {max = mid - 1;} else if (arr[mid] < number) {min = mid + 1;} else {return mid;}}}
}

相关文章:

二分查找算法(全网最详细代码演示)

二分查找也称 半查找&#xff08;Binary Search&#xff09;&#xff0c;它时一种效率较高的查找方法。但是&#xff0c;折半查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字 有序 排列。 注意&#xff1a;使用二分查找的前提是 该数组是有序的。 在实际开…...

draw up a plan

爱情是美好的&#xff0c;却不是唯一的。爱情只是属于个人化的感情。 推荐一篇关于爱情的美文&#xff1a; 在一个小镇上&#xff0c;有一家以制作精美巧克力而闻名的手工巧克力店&#xff0c;名叫“甜蜜之爱”。这家巧克力店是由一位名叫艾玛的年轻女性经营的&#xff0c;她对…...

抖音seo源码开发源代码开发技术分享

一、 抖音SEO源码开发&#xff0c;需要掌握以下技术&#xff1a; 抖音API接口&#xff1a;抖音提供了丰富的API接口&#xff0c;包括用户信息、视频信息、评论信息等。 数据爬取技术&#xff1a;通过抓包分析抖音接口的数据结构&#xff0c;可以使用Python等编程语言编写爬虫程…...

QEMU(Quick Emulator)

QEMU&#xff08;Quick Emulator&#xff09;是一款由法布里斯贝拉等人编写的免费的可执行硬件虚拟化的开源托管虚拟机。它可以通过动态的二进制转换模拟CPU&#xff0c;并提供一组设备模型&#xff0c;使它能够运行多种未修改的客户机OS。QEMU还可以为user-level的进程执行CPU…...

Gateway结合nacos(lb://xxx)无效问题

Gateway结合nacos无效 版本如下&#xff1a; com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0.1.0 org.springframework.cloud:spring-cloud-starter-gateway:3.1.1 配置如下&#xff1a; server:port: 7000 spring:application:name: springCloudGa…...

NODEJS笔记

全局对象 global/window console.log/info/warn/error/time/timeEnd process.arch/platform/version/env/kill/pid/nextTick Buffer.alloc(5,abcde) String/toString setTimeout/clearTimeout setInterval/clearInterval setImmediate/clearImmediate process.nextTi…...

无涯教程-jQuery - html( )方法函数

html(val)方法获取第一个匹配元素的html内容(innerHTML)。此属性在XML文档上不可用。 html( ) - 语法 selector.html( ) html( ) - 示例 以下是一个简单的示例&#xff0c;简单说明了此方法的用法- <html><head><title>The jQuery Example</title>…...

Linux vsftp三种模式的简单配置部署

环境&#xff1a;Debian 6.1.27-1kali1 (2023-05-12) vsftpd 安装 --查看是否当前系统是否已安装 apt list --installed | grep vsftpd 没有安装的话&#xff0c;就正常安装 apt-get update apt-get install vsftpd 一、匿名用户模式 分享一些不重要文件&#xff0c;任…...

6.1.tensorRT高级(1)-概述

目录 前言1. tensorRT高级概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-概述 课程大纲可看下面的思维…...

【Python】将M4A\AAC录音文件转换为MP3文件

文章目录 m4aaac 基础环境&#xff1a; sudo apt-get install ffmpegm4a 要将M4A文件转换为MP3文件&#xff0c;你可以使用Python中的第三方库pydub。pydub使得音频处理变得非常简单。在开始之前&#xff0c;请确保你已经安装了pydub库&#xff0c;如果没有&#xff0c;可以通…...

个性新颖纯css手风琴效果选项卡

当涉及到个性新颖的纯CSS手风琴效果选项卡时&#xff0c;有多种方法可以实现。以下是三种可能的方法&#xff1a; 三种方法实现 方法一&#xff1a;使用:target伪类和CSS过渡效果 <style>.accordion {width: 300px;}.accordion-item {overflow: hidden;max-height: 0;…...

js的sendBeacon方法介绍

js的sendBeacon方法介绍 Beacon API是一种轻量级且有效的将网页活动记录到服务器的方法。它是一个 JavaScript API&#xff0c;可帮助开发人员将少量数据&#xff08;例如分析或跟踪信息、调试或诊断数据&#xff09;从浏览器发送到服务器。 在本文中&#xff0c;我们将介绍B…...

【Tomcat---1】IDEA控制台tomcat日志输出乱码解决

一、修改IDEA的文件编码配置为UTF-8 二、修改IDEA的vmoptions文件&#xff0c;添加-Dfile.encodingUTF-8 到Tomcat目录/conf文件夹修改logging.properties 重启idea即可。采用统一的编码...

Redis学习路线(2)—— Redis的数据结构

一、Redis的数据结构 Redis是一个Key-Value的数据库&#xff0c;key一般是String类型&#xff0c;不过Value的类型却有很多&#xff1a; String&#xff1a; Hello WorldHash&#xff1a; {name: "jack", age: 21}List&#xff1a; [A -> B -> C -> C]Set…...

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)

探究Redis服务启动的过程机制的技术原理和流程分析的指南&#xff08;持久化功能分析&#xff09; Redis提供的持久化机制Redis持久化如何工作Redis持久化的故障分析持久化频率操作分析数据库多久调用一次write&#xff0c;将数据写入内核缓冲区&#xff1f;内核多久将系统缓冲…...

IT管理者年过50后何去何从

最近面试了一位前职为IT技术及管理专家&#xff0c;知名院校硕士毕业&#xff0c;唯一不同的是&#xff0c;他是一名已过50岁的IT技术及管理者。一直知道过了50岁&#xff0c;我们估计会有很大的坎&#xff0c;但是那时候从未曾想过连我们保险公司都会因为年龄而拒绝这样优秀的…...

C++字符串题基础(进阶请看下一个文章)

打印小写字母表 #include<iostream> #include<string.h> #include<iomanip> #include<stdio.h> #include<cmath> using namespace std; int main() {char na;for(int i1;i<13;i){cout<<n;n;}cout<<endl;for(int i1;i<13;i){c…...

webpack如何实现热更新?

webpack如何实现热更新&#xff1f; 要使用 Webpack 实现热更新&#xff0c;可以按照以下步骤进行配置&#xff1a; 1.在项目中安装 Webpack 和相关的开发依赖&#xff1a; npm install webpack webpack-cli webpack-dev-server --save-dev2.创建一个名为 webpack.dev.js 的…...

REST API的基础:HTTP

在本文中&#xff0c;我们将深入探讨万维网数据通信的基础 - HTTP。 什么是超文本&#xff1f; HTTP&#xff08;超文本传输协议&#xff09;的命名源于“超文本”。 那么&#xff0c;什么是超文本&#xff1f; 想象一下由超链接组成的文本、图像和视频的混合物。这些链接充当我…...

基于Docker-compose创建LNMP环境并运行Wordpress网站平台

基于Docker-compose创建LNMP环境并运行Wordpress网站平台 1.Docker-Compose概述2.YAML文件格式及编写注意事项3.Docker-Compose配置常用字段4.Docker Compose常用命令5.使用Docker-compose创建LNMP环境&#xff0c;并运行Wordpress网站平台1. Docker Compose 环境安装下载安装查…...

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境3

4、下载MaixPy IDE&#xff0c;MaixPy 使用Micropython 脚本语法&#xff0c;所以不像 C语言 一样需要编译&#xff0c;要使用MaixPy IDE , 开发板固件必须是V0.3.1 版本以上&#xff08;这里使用V0.5.0&#xff09;, 否则MaixPy IDE上会连接不上&#xff0c; 使用前尽量检查固…...

Java语言跨平台执行的核心JVM

本文重点 在前面的课程中,我们介绍了java中的三层JDK->JRE->JVM,其中JVM称为Java的虚拟机,只是用来执行的,JRE是运行环境,要想在操作系统中运行,除了JVM还需要类库,JDK=JRE+开发的包和工具。本文就将介绍一下JVM究竟为何物? JVM 有的人会认为JVM是java中的东西…...

家政服务小程序制作攻略揭秘

想要打造一个家政服务小程序&#xff0c;但是又不懂编程和设计&#xff1f;不用担心&#xff01;下面将为你详细介绍如何利用第三方平台&#xff0c;从零开始打造一个家政服务小程序。 首先&#xff0c;你需要找到一个适合的第三方平台&#xff0c;例如乔拓云网。在乔拓云网的【…...

2023-07-29力扣每日一题

链接&#xff1a; 141. 环形链表 题意&#xff1a; 求链表是否有环 解&#xff1a; 刚好昨天做完的初级算法链表题&#xff0c;翻转和暴力 实际代码&#xff1a; #include<iostream> using namespace std; struct ListNode {int val;ListNode *next;ListNode() : …...

Dual pyramid GAN for semantic image synthesis

为了解决在图像合成时候小物体容易消失&#xff0c;大物体经常作为块的拼接来生成的。本文提出DP-GAN在所有尺度下共同学习空间自适应归一化模块的条件。这样尺度信息就会被双向使用&#xff0c;他统一了不同尺度的监督。(重点看图和代码) SPADE模块解释 GAN在生成包含许多不同…...

【Linux】更换jdk版本

目录 一、前言二、查看jdk版本号1、项目中的版本号&#xff08;pom.xml&#xff09;2、服务器中的版本号 三、更换jdk版本1、创建java文件夹2、下载并解压JDK安装包①、下载jdk安装包②、移动到创建好的/usr/local/java路径下③、解压jdk安装包 四、删除原来的jdk版本1、删除原…...

web-暴力破解密码

Burte Force&#xff08;暴力破解&#xff09;概述 暴力破解”是一攻击具手段&#xff0c;在web攻击中&#xff0c;一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录&#xff0c;直到得到正确的结果。 为了提高效率&…...

基础实验篇 | CopterSim中回传提示消息实验

基础实验篇|CopterSim中回传提示消息实验 01实验名称及目的 回传提示消息实验&#xff1a;在飞控中&#xff0c;我们时常需要向外发布一些文字消息&#xff0c;来反映系统当前的运行状态&#xff0c;这个功能可以通过发送“mavlink_log”的uORB消息来实现。 02实验效果 在Cop…...

vue基础-动态style

vue基础-动态style 1、目标2、语法 1、目标 给标签动态设置style值 2、语法 :style"{style属性名:值}"示例&#xff1a; <template><div id"app"><div><p :style"{backgroundColor:color}">动态styleclass</p>…...

vue3使用响应式数据 + v-model导致响应式失效el-form表单无法输入的问题

文章目录 vue3使用响应式数据 v-model导致响应式失效el-form表单无法输入的问题 vue3使用响应式数据 v-model导致响应式失效el-form表单无法输入的问题 参考文章 重构vue2项目时发现的问题&#xff0c;原始项目使用的是Element-ui。 其实vue3可以使用适配的Element-plus 问…...

中铁建设门户网登录入口手机端/网店关键词怎么优化

昨天写了篇博客&#xff0c;介绍了一下我对node.js的第一次亲密接触后的感受&#xff0c;以为node.js很小众&#xff0c;出乎我意料很多人感兴趣&#xff0c;并且对博客中的细节问题做了评论&#xff0c;最多的是围绕node.js的异步与单线程展开的&#xff0c;当然还有很多关于n…...

怎样在b2b网站做推广/5g网络优化

在这篇《MVC母版页_Layout.cshtml》http://www.cnblogs.com/insus/p/3380419.html中&#xff0c;把一些已经存在的视图或是新产生的视图加入母版中。不管怎样实现&#xff0c;产生出来的视图&#xff0c;均会有一行代码&#xff0c;即是它指向哪一个母版页的&#xff1a;如果你…...

品牌工厂网站建设/离我最近的电脑培训中心

2019年第 12 篇文章图片建议放大观看Hello&#xff0c;大家好&#xff0c;我是利兄~在PPT中表格非常常见&#xff0c;尤其是一些数据汇报类PPT&#xff0c;表格就是家常便饭。相对于图表&#xff0c;表格可以承载更多的信息&#xff0c;如果设计的好&#xff0c;在展现上的优势…...

wordpress更换新主题/国内真正的免费建站

在实际引用的场景中&#xff0c;经常会有这样一种情况&#xff0c;客户那边由于网络或者安全考虑需要内网操作&#xff0c;没有对应的网络环境&#xff0c;进行项目创建和引用添加都只能通过离线的方式添加&#xff0c;那么如何离线安装AR对应的引用&#xff1f; 点击获取Acti…...

wordpress手机版怎么做/互联网营销培训课程

初中就开始学习线性回归&#xff0c;并且可以根据最小二乘法&#xff0c;计算出线性回归系数&#xff0c;进而利用线性回归进行数据的简单预测。线性模型是机器学习中最简单、应用最广泛的模型&#xff0c;指通过样本特征的线性组合来进行预测的模型。给定一个d维样本[x1, ,…...

wordpress 搜索 很慢/网站排名优化软件联系方式

欢迎大家关注本博&#xff0c;同时欢迎大家评论交流&#xff0c;可以给个赞哦&#xff01;&#xff01;&#xff01; 在进行Web开发过程中&#xff0c;都会直接或间接的接触到Servlet&#xff0c;比如最基本的基于Servlet的应用、基于Spring技术栈的应用。在依赖Spring技术栈进…...