如何使用二分法查找
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,本篇内容介绍了"如何使用二分法查找"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、二分法查找的背景
千家信息网最后更新 2025年01月21日如何使用二分法查找
本篇内容介绍了"如何使用二分法查找"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
1、二分法查找的背景
当数组或者集合中存放的元素数量非常多的时候,想要跟踪具体某个元素的位置或者是否存在,常规方式是循环每一个元素直到找到要查找的元素为止。这样的查找方式效率非常低下,这个时候需要使用二分法来实现,提高查找效率。
2、二分法查找的介绍
二分法查找(折半查找),找指定数值所在的位置
百度百科是这样介绍二分法查找的:
3、二分法查找的算法思想
假设数组是按升序排序的,对于给定的目标值aim,从数组的中间位置开始查找:1.若查找数据与中间元素值正好相等,则返回中间元素值的索引;2.若查找数值比中间值小,则以整个查找范围的前半部分作为新的查找范围;3.若查找数值比中间值大,则以整个查找范围的后半部分作为新的查找范围;注:查找成功返回索引,失败返回-1
4、代码实现
4.1 利用循环的方式实现二分法查找
public class BinarySearch { public static void main(String[] args) { // 生成一个随机数组 int[] array = suiji(); // 对随机数组排序 Arrays.sort(array); System.out.println("产生的随机数组为: " + Arrays.toString(array)); System.out.println("要进行查找的值: "); Scanner input = new Scanner(System.in); // 进行查找的目标值 int aim = input.nextInt(); // 使用二分法查找 int index = binarySearch(array, aim); System.out.println("查找的值的索引位置: " + index); } /** * 生成一个随机数组 * * @return 返回值,返回一个随机数组 */ private static int[] suiji() { // random.nextInt(n)+m 返回m到m+n-1之间的随机数 int n = new Random().nextInt(6) + 5; int[] array = new int[n]; // 循环遍历为数组赋值 for (int i = 0; i < array.length; i++) { array[i] = new Random().nextInt(100); } return array; } /** * 二分法查找 ---循环的方式实现 * * @param array 要查找的数组 * @param aim 要查找的值 * @return 返回值,成功返回索引,失败返回-1 */ private static int binarySearch(int[] array, int aim) { // 数组最小索引值 int left = 0; // 数组最大索引值 int right = array.length - 1; int mid; while (left <= right) { mid = (left + right) / 2; // 若查找数值比中间值小,则以整个查找范围的前半部分作为新的查找范围 if (aim < array[mid]) { right = mid - 1; // 若查找数值比中间值大,则以整个查找范围的后半部分作为新的查找范围 } else if (aim > array[mid]) { left = mid + 1; // 若查找数据与中间元素值正好相等,则放回中间元素值的索引 } else { return mid; } } return -1; } }
代码执行结果:
产生的随机数组为: [16, 33, 40, 46, 57, 63, 65, 71, 85] 要进行查找的值: 46 查找的值的索引位置: 3
若输入的值找不到,则返回-1
产生的随机数组为: [28, 41, 47, 56, 70, 81, 85, 88, 95] 要进行查找的值: 66 查找的值的索引位置: -1
4.2 利用递归的方式实现二分法查找
public class BinarySearch3 { public static void main(String[] args) { // 生成一个随机数组 int[] array = suiji(); // 对随机数组排序 Arrays.sort(array); System.out.println("产生的随机数组为: " + Arrays.toString(array)); System.out.println("要进行查找的值: "); Scanner input = new Scanner(System.in); // 进行查找的目标值 int aim = input.nextInt(); // 使用二分法查找 int index = binarySearch(array, aim, 0, array.length - 1); System.out.println("查找的值的索引位置: " + index); } /** * 生成一个随机数组 * * @return 返回值,返回一个随机数组 */ private static int[] suiji() { // Random.nextInt(n)+m 返回m到m+n-1之间的随机数 int n = new Random().nextInt(6) + 5; int[] array = new int[n]; // 循环遍历为数组赋值 for (int i = 0; i < array.length; i++) { array[i] = new Random().nextInt(100); } return array; } /** * 二分法查找 ---递归的方式 * * @param array 要查找的数组 * @param aim 要查找的值 * @param left 左边最小值 * @param right 右边最大值 * @return 返回值,成功返回索引,失败返回-1 */ private static int binarySearch(int[] array, int aim, int left, int right) { if (aim < array[left] || aim > array[right]) { return -1; } // 找中间值 int mid = (left + right) / 2; if (array[mid] == aim) { return mid; } else if (array[mid] > aim) { //如果中间值大于要找的值则从左边一半继续递归 return binarySearch(array, aim, left, mid - 1); } else { //如果中间值小于要找的值则从右边一半继续递归 return binarySearch(array, aim, mid + 1, array.length-1); } } }
递归相较于循环,代码比较简洁,但是时间和空间消耗比较大,效率低。在实际的学习与工作中,根据情况选择使用。
"如何使用二分法查找"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
数组
二分法
索引
元素
位置
范围
循环
方式
递归
数值
生成
成功
代码
效率
目标
目标值
排序
最大
最小
之间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
河源教师招聘网络技术
萤火突击服务器二维码
中国知网平台是什么数据库
羽毛球数据库
linq 删除数据库记录
大数据网络安全概述
统信服务器市场分析
开网络安全公司赚钱吗
无人机通讯软件开发
给爸爸妈妈的一封网络安全信
软件开发过程 软件描述
怎么获取数据库中表名
极客网络安全技能挑战赛
电大web服务器运维管理
深圳拼上拼软件开发
简述网络安全的概念分析
网络杯网络安全知识竞赛
如何注意校园网络安全
软件开发知识产权问题
公司人多就连接不上服务器
hyper怎么添加服务器
管理软件的服务器入固定资产
网络安全 公司设计内网网段
湖北计算机软件开发定制
数据库中如何切换hr模式
深圳凤起网络技术怎么样
数据库前端开发工具的产品是
火力全开好玩的服务器
项目软件开发书
从数据库获取数据