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

【已解决】如何使用JAVA 语言实现二分查找-二分搜索折半查找【算法】手把手学会二分查找【数据结构与算法】

文章目录

  • 前言
      • 任务描述
      • 编程要求
    • 输出样例:未查找到11元素!
  • 二、代码实现
  • 总结
    • 理解不了考试的时候直接背下来就好了。


前言

[TOC]二分搜索

任务描述

折半查找(二分搜索)
a[low..high]是当前的查找区间,首先确定该区间的中点位置mid=(low+high)/2;然后将待查的k值与a[mid].key比较:
(1)若k==a[mid],则查找成功并返回该元素的物理下标;
(2)若k<a[mid],则由表的有序性可知a[mid..high]均大于k,因此若表中存在关键字等于k的元素,则该元素必定位于左子表a[low..mid-1]中,故新的查找区间是左子表a[low..mid-1]
(3)若k>a[mid],则要查找的k必在位于右子表a[mid+1..high]中,即新的查找区间是右子表a[mid+1..high]。
  下一次查找是针对新的查找区间进行的。

本关任务:编写一个进行二分搜索的小程序。

编程要求

根据提示,在右侧编辑器补充代码,能够实现二分搜索。

测试说明
输入样例:

10
1 2 3 4 5 6 7 8 9 10
6

(其中第一行的10:表示数组中元素的个数
第二行的1…10是输入的数组中的元素
第三行的6 是表示查找元素6)

输出样例:
6是数组中的第6个元素

输入样例:

10
1 2 3 4 5 6 7 8 9 10
11

(其中第一行的10:表示数组中元素的个数
第二行的1…10是输入的数组中的元素
第三行的11 是表示查找元素11)

输出样例:未查找到11元素!

二、代码实现

import java.util.Scanner;/**1. @author 海宁不掉头发*/
public class BinSearch {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();//数组中元素的个数int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scanner.nextInt();//输入数组中的元素}//查找的元素int target = scanner.nextInt(); // 需要查找的元素是多少scanner.close();int index = binarySearch(arr, target); // 定义一个二分查找的方法,对数组和穿进去的要查找那个元素进行操作//进行二分查找if (index != -1) {System.out.println(target + "是数组中的第" + (index + 1) + "个元素");//输出查找结果} else {System.out.println("未查找到" + target + "元素!");//输出未查找的结果}}public static int binarySearch(int[] arr, int target) {int low = 0;  // 初始位是0int high = arr.length - 1; //  最高位是数组中的最后一位while (low <= high) { // 循环一个元素,是否最小位的小于最大位int mid = (low + high) / 2; // 找到数组中在中间位置的下标//计算中点的位置if (arr[mid] == target) {  // 如果要查找数字的位置就是数组中间的元素return mid;//直接返回这个数字} else if (arr[mid] > target) { // 否则如果是 要查找的这个元素小于数组最中间的元素,那么肯定是在左边这一半了high = mid - 1;  // 中间数组的下标-1再赋给最高位 如此反复循环} else {low = mid + 1; // 否则就是在右边那一半,反复循环直到找到输入最初的那个数字的位置为止。}}return -1; //这里返回-1 的意思输入报错,所有条件均不满足,逻辑错误。当查找区间为空(即low > high)时,说明目标值不存在于数组中,返回 -1。}
}

总结

二分查找是一种高效的查找算法,适用于已排序的数组。其基本思想是将查找区间不断缩小一半,通过比较目标值与区间中间元素的大小关系来确定下一步查找的区间,重复这个过程直到找到目标值或者确定目标值不存在。

  1. 深了对算法效率的认识:通过对比二分查找和顺序查找的时间复杂度,深刻体会到选择合适算法的重要性。在处理大规模数据时,高效的算法可以大大节省时间和资源。
  2. 培养了逻辑思维能力:实现二分查找需要仔细考虑边界条件、循环条件和中间值的计算等问题,这锻炼了逻辑思维的严密性和准确性。
  3. 理解了分治思想的应用:二分查找是分治思想的一种体现,将问题不断分解为更小的子问题,通过逐步缩小查找区间来解决问题。这种思想在其他算法和问题解决中也有广泛的应用。
  4. 认识到数据结构和算法的重要性:良好的数据结构和高效的算法是编写高质量程序的基础。学习和掌握各种算法可以提高编程能力和解决问题的效率。

总之,学习用 Java 代码实现二分查找是一次很有价值的学习经历,不仅掌握了一种实用的查找算法,还提高了对数据结构和算法的理解和应用能力。

二分查找的关键核心代码:

public class BinarySearch {public static int binarySearch(int[] arr, int target) {int low = 0;int high = arr.length - 1;while (low <= high) {int mid = low + (high - low) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return -1;}
}

理解不了考试的时候直接背下来就好了。


相关文章:

【已解决】如何使用JAVA 语言实现二分查找-二分搜索折半查找【算法】手把手学会二分查找【数据结构与算法】

文章目录 前言任务描述编程要求 输出样例:未查找到11元素&#xff01; 二、代码实现总结理解不了考试的时候直接背下来就好了。 前言 [TOC]二分搜索 任务描述 折半查找&#xff08;二分搜索&#xff09; 设a[low..high]是当前的查找区间&#xff0c;首先确定该区间的中点位置…...

ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

你遇到的错误是由于 MySQL 版本不再默认支持 mysql_native_password 认证插件导致的。从 MySQL 8.0 开始&#xff0c;默认的认证插件是 caching_sha2_password&#xff0c;而不是 mysql_native_password。 解释&#xff1a; 错误 ERROR 1524 (HY000): Plugin mysql_native_pa…...

.NET 6.0 WebAPI 使用JWT生成Token的验证授权

1.引入相关程序包JwtBearer注意版本: 2.配置文件appsettings.json写相关配置参数(也可不写&#xff0c;写在程序里面&#xff0c;数据库读取也是一样的) , //JWT加密"JWTToken": {"SecretKey": "jsaduwqe6asdjewejdue7dfmsdfu0sdfmwmsd8wfsd6",…...

M9410A VXT PXI 矢量收发信机,300/600/1200MHz带宽

M9410A PXI 矢量收发信机 -300/600/1200MHz带宽- M9410A VXT PXI 矢量收发信机&#xff0c;300/600/1200MHz带宽支持 5G 的 PXI 矢量收发信机&#xff08;VXT&#xff09;是一个 2 插槽模块&#xff0c;具有 1.2 GHz 的瞬时带宽 主要特点 Keysight M9410A VXT PXIe 矢量收发…...

用工厂模式演示springboot三种注入方式 | @Autowired

背景&#xff1a;看了个demo工厂模式&#xff0c;示例代码的工厂类是new出来的&#xff0c;但是实际项目中都是用springboot框架、bean都是会给容器管理的&#xff0c;所以在思考这个工厂类要交给springboot托管要怎么改。以下是总结笔记 依赖注入 1.工厂类用new实现2.工厂类用…...

es查询语法

查询关键词的含义&#xff1a; match: 用于进行全文搜索&#xff0c;分析查询文本并与倒排索引中的词项进行匹配。 term: 精确匹配&#xff0c;适用于非分析字段&#xff0c;如 keyword 类型。用于查找字段值完全相等的文档。 bool: 组合多个查询条件。可以使用 must&#xf…...

LabVIEW提高开发效率技巧----合理使用数据流与内存管理

理使用数据流和内存管理是LabVIEW开发中提高性能和稳定性的关键&#xff0c;特别是在处理大数据或高频率信号时&#xff0c;优化可以避免内存消耗过大、程序卡顿甚至崩溃。 1. 使用 Shift Register 进行内存管理 Shift Register&#xff08;移位寄存器&#xff09; 是 LabVIE…...

如何在 ECharts 中设置轴标签

在 ECharts 中&#xff0c;轴标签&#xff08;Axis Label&#xff09;是指 X 轴或 Y 轴上的刻度标签&#xff0c;用于显示轴上的数据值或分类名称。你可以通过配置 xAxis&#xff08;X 轴&#xff09;或 yAxis&#xff08;Y 轴&#xff09;的 axisLabel 属性来设置轴标签的样式…...

怎么用gitee做一个图片仓库,在md文档中用这个图片网络地址,然后显示图片

痛因&#xff1a;我为什么要这样做&#xff0c;呃&#xff0c;我一开始图片都是存本地地址的&#xff0c;放在和这个md文档同级的assets文件夹下面&#xff0c;这样子确实当时很方便&#xff0c;复制粘贴什么也不用管&#xff0c;但是想把这个文档分享给别的人的时候&#xff0…...

Thinkphp(TP)

1.远程命令执行 /index.php?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]whoami 2.远程代码执行 /index.php?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]…...

【艾思科蓝】前端框架巅峰对决:React、Vue与Angular的全面解析与实战指南

【JPCS独立出版】​第三届能源与动力工程国际学术会议&#xff08;EPE 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;https://ais.cn/u/nuyAF3 引言 在快速发展的前端技术领域&#xff0c;选择合适的框架或库对于项目的成功至关重要。React、Vu…...

IT行业的未来:技术变革与创新的持续推动

IT行业的未来&#xff1a;技术变革与创新的持续推动 随着数字化进程的不断加速&#xff0c;信息技术&#xff08;IT&#xff09;行业正迈入一个快速变革的时代。新兴技术如人工智能&#xff08;AI&#xff09;、5G、物联网&#xff08;IoT&#xff09;和区块链&#xff0c;正在…...

Python PDF转图片自定义输出

PDF转图片自定义输出 一、引入必要库 1 2import fitz import os也可以检查一下版本就是了&#xff1a;print(fitz.__doc__) 上一篇文章已经介绍过要使用的库&#xff0c;和写代码要用到的思路了。我们直接开始&#xff1a; 二、找到文件 首先是我们要获取用户的输入&#x…...

Git 常用操作命令说明

Git 常用操作命令 1. 初始化和克隆仓库 1.1 初始化仓库 git init在当前目录初始化一个新的 Git 仓库。 1.2 克隆仓库 git clone <repository-url>从远程仓库克隆项目到本地。 示例&#xff1a; git clone https://github.com/user/repo.git2. 查看状态和日志 2.1…...

自学前端的正确姿势是...

师傅带进门&#xff0c;修行在个人。 在前端自学成才的道路上&#xff0c;有些人走的很快&#xff0c;有些人却举步维艰。 为什么会这样子呢&#xff1f;因为他们没有掌握自学前端的正确姿势。 在介绍应该要怎样自学前端之前&#xff0c;首先来看下&#xff0c;自学前端容易…...

C/C++语言基础--C++构造函数、析构函数、深拷贝与浅拷贝等等相关知识讲解

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 周末休息了&#xff0c;没有更新&#xff0c;请大家见谅哈&#xff1b;构造函数、析构函数可以说便随着C每一个程序&#xff0c;故学构造函数、析构函数是必要的&#xff1b;C语言后面也会继续更新知识点&am…...

json格式互相转换

您提供的字符串已经是一个JSON格式的字符串&#xff0c;但是JSON标准要求键名必须用双引号括起来&#xff0c;而不是单引号。因此&#xff0c;您需要将字符串中的单引号替换为双引号。以下是转换后的JSON字符串&#xff1a; {"图片描述": "高速公路上发生了严重…...

Linux下共享内存详解

共享内存是Linux中一种高效的进程间通信&#xff08;IPC&#xff09;方式&#xff0c;它允许多个进程共享同一段内存&#xff0c;从而实现数据的快速传递。共享内存通常比其他IPC机制&#xff08;如管道或消息队列&#xff09;更快&#xff0c;因为数据直接存储在内存中&#x…...

MySQL篇(管理工具)

目录 一、系统数据库 二、常用工具 1. mysql 2. mysqladmin 3. mysqlbinlog 4. mysqlshow 5. mysqldump 6. mysqlimport/source 6.1 mysqlimport 6.2 source 一、系统数据库 MySQL数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xf…...

redis学习笔记(六)

redis每种数据结构的应用场景 1. 字符串 (String) 应用场景 &#xff1a; 缓存&#xff1a;存储频繁访问的数据&#xff0c;如网页缓存、会话信息等。计数器&#xff1a;实现统计和计数功能&#xff0c;如访问计数、统计数据等。键值存储&#xff1a;简单的键值对存储&#xf…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...