二分查找算法(全网最详细代码演示)
二分查找也称 半查找(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;}}} }
相关文章:

二分查找算法(全网最详细代码演示)
二分查找也称 半查找(Binary Search),它时一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字 有序 排列。 注意:使用二分查找的前提是 该数组是有序的。 在实际开…...

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

抖音seo源码开发源代码开发技术分享
一、 抖音SEO源码开发,需要掌握以下技术: 抖音API接口:抖音提供了丰富的API接口,包括用户信息、视频信息、评论信息等。 数据爬取技术:通过抓包分析抖音接口的数据结构,可以使用Python等编程语言编写爬虫程…...
QEMU(Quick Emulator)
QEMU(Quick Emulator)是一款由法布里斯贝拉等人编写的免费的可执行硬件虚拟化的开源托管虚拟机。它可以通过动态的二进制转换模拟CPU,并提供一组设备模型,使它能够运行多种未修改的客户机OS。QEMU还可以为user-level的进程执行CPU…...
Gateway结合nacos(lb://xxx)无效问题
Gateway结合nacos无效 版本如下: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0.1.0 org.springframework.cloud:spring-cloud-starter-gateway:3.1.1 配置如下: 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( ) - 示例 以下是一个简单的示例,简单说明了此方法的用法- <html><head><title>The jQuery Example</title>…...

Linux vsftp三种模式的简单配置部署
环境:Debian 6.1.27-1kali1 (2023-05-12) vsftpd 安装 --查看是否当前系统是否已安装 apt list --installed | grep vsftpd 没有安装的话,就正常安装 apt-get update apt-get install vsftpd 一、匿名用户模式 分享一些不重要文件,任…...

6.1.tensorRT高级(1)-概述
目录 前言1. tensorRT高级概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-概述 课程大纲可看下面的思维…...
【Python】将M4A\AAC录音文件转换为MP3文件
文章目录 m4aaac 基础环境: sudo apt-get install ffmpegm4a 要将M4A文件转换为MP3文件,你可以使用Python中的第三方库pydub。pydub使得音频处理变得非常简单。在开始之前,请确保你已经安装了pydub库,如果没有,可以通…...
个性新颖纯css手风琴效果选项卡
当涉及到个性新颖的纯CSS手风琴效果选项卡时,有多种方法可以实现。以下是三种可能的方法: 三种方法实现 方法一:使用:target伪类和CSS过渡效果 <style>.accordion {width: 300px;}.accordion-item {overflow: hidden;max-height: 0;…...
js的sendBeacon方法介绍
js的sendBeacon方法介绍 Beacon API是一种轻量级且有效的将网页活动记录到服务器的方法。它是一个 JavaScript API,可帮助开发人员将少量数据(例如分析或跟踪信息、调试或诊断数据)从浏览器发送到服务器。 在本文中,我们将介绍B…...

【Tomcat---1】IDEA控制台tomcat日志输出乱码解决
一、修改IDEA的文件编码配置为UTF-8 二、修改IDEA的vmoptions文件,添加-Dfile.encodingUTF-8 到Tomcat目录/conf文件夹修改logging.properties 重启idea即可。采用统一的编码...
Redis学习路线(2)—— Redis的数据结构
一、Redis的数据结构 Redis是一个Key-Value的数据库,key一般是String类型,不过Value的类型却有很多: String: Hello WorldHash: {name: "jack", age: 21}List: [A -> B -> C -> C]Set…...

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)
探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析) Redis提供的持久化机制Redis持久化如何工作Redis持久化的故障分析持久化频率操作分析数据库多久调用一次write,将数据写入内核缓冲区?内核多久将系统缓冲…...
IT管理者年过50后何去何从
最近面试了一位前职为IT技术及管理专家,知名院校硕士毕业,唯一不同的是,他是一名已过50岁的IT技术及管理者。一直知道过了50岁,我们估计会有很大的坎,但是那时候从未曾想过连我们保险公司都会因为年龄而拒绝这样优秀的…...
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如何实现热更新? 要使用 Webpack 实现热更新,可以按照以下步骤进行配置: 1.在项目中安装 Webpack 和相关的开发依赖: npm install webpack webpack-cli webpack-dev-server --save-dev2.创建一个名为 webpack.dev.js 的…...

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

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

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 核心…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...