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

文章目录


前言

TOC\]二分搜索 #### 任务描述 折半查找(二分搜索) 设`a[low..high]`是当前的查找区间,首先确定该区间的中点位置`mid=(low+high)/2`;然后将待查的k值与`a[mid].key`比较: (1)若`k==a[mid]`,则查找成功并返回该元素的物理下标; (2)若`ka[mid]`,则要查找的k必在位于右子表`a[mid+1..high]`中,即新的查找区间是右子表`a[mid+1..high]。`   下一次查找是针对新的查找区间进行的。 **本关任务:编写一个进行二分搜索的小程序。** #### 编程要求 根据提示,在右侧编辑器补充代码,能够实现二分搜索。 测试说明 输入样例: ```go 10 1 2 3 4 5 6 7 8 9 10 6 ``` **(其中第一行的10:表示数组中元素的个数 第二行的1...10是输入的数组中的元素 第三行的6 是表示查找元素6)** ```go 输出样例: 6是数组中的第6个元素 ``` 输入样例: ```go 10 1 2 3 4 5 6 7 8 9 10 11 ``` (其中第一行的10:表示数组中元素的个数 第二行的1...10是输入的数组中的元素 第三行的11 是表示查找元素11) ### 输出样例:未查找到11元素! ## 二、代码实现 ```java 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; // 初始位是0 int 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。 } } ``` ## 总结 **二分查找是一种高效的查找算法,适用于已排序的数组。其基本思想是将查找区间不断缩小一半,通过比较目标值与区间中间元素的大小关系来确定下一步查找的区间,重复这个过程直到找到目标值或者确定目标值不存在。** 2. 深了对算法效率的认识:通过对比二分查找和顺序查找的时间复杂度,深刻体会到选择合适算法的重要性。在处理大规模数据时,高效的算法可以大大节省时间和资源。 3. 培养了逻辑思维能力:实现二分查找需要仔细考虑边界条件、循环条件和中间值的计算等问题,这锻炼了逻辑思维的严密性和准确性。 4. 理解了分治思想的应用:二分查找是分治思想的一种体现,将问题不断分解为更小的子问题,通过逐步缩小查找区间来解决问题。这种思想在其他算法和问题解决中也有广泛的应用。 5. 认识到数据结构和算法的重要性:良好的数据结构和高效的算法是编写高质量程序的基础。学习和掌握各种算法可以提高编程能力和解决问题的效率。 总之,学习用 Java 代码实现二分查找是一次很有价值的学习经历,不仅掌握了一种实用的查找算法,还提高了对数据结构和算法的理解和应用能力。 二分查找的关键核心代码: ```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; } } ``` *** ** * ** *** ### 理解不了考试的时候直接背下来就好了。 *** ** * ** ***

相关推荐
爱尔兰极光39 分钟前
LeetCode 热题 100-连续最长序列
算法·leetcode·职场和发展
Warren9839 分钟前
一次文件上传异常的踩坑、定位与修复复盘(Spring Boot + 接口测试)
java·开发语言·spring boot·笔记·后端·python·面试
生成论实验室40 分钟前
生成式通用智能(GAGI):基于《易经》状态空间的认知架构
人工智能·神经网络·算法·架构·信息与通信
如意猴40 分钟前
002【模拟】--蛇形方阵、字符串展开
算法
JMchen12340 分钟前
Android相机硬件抽象层(HAL)逆向工程:定制ROM的相机优化深度指南
android·开发语言·c++·python·数码相机·移动开发·android studio
lang2015092841 分钟前
一键生成Java Web项目:Tomcat-Maven原型解析
java·前端·tomcat
heartbeat..42 分钟前
JVM 参数配置指南:内存调优、收集器选择与问题排查
java·运维·jvm·性能优化
娇娇乔木42 分钟前
模块九--static/可变参数/递归/冒泡排序/二分查找/对象数组/方法参数/快速生成方法/debug--尚硅谷Javase笔记总结
java·开发语言
We་ct42 分钟前
LeetCode 242. 有效的字母异位词:解法解析与时空优化全攻略
前端·算法·leetcode·typescript
执着25943 分钟前
力扣hot100 - 104、二叉树的最大深度
算法·leetcode·职场和发展