【21天学习挑战】经典算法之【折半查找】

🚀个人主页:欢迎访问Ali.s的首页

⏰ 最近更新:2022年8月11日

⛽ Java框架学习系列:【Spring】【SpringMVC】【Mybatis】

🔥 Java项目实战系列:【飞机大战】【图书管理系统】

🍭 Java算法21天系列:【查找】【排序】【递归】

⛳ Java基础学习系列:【继承】【封装】【多态】

🏆 通信仿真学习系列:【硬件】【通信】【MATLAB】

🍄 个人简介:通信工程本硕🌈、Java程序员🚴。目前只会CURD😂

💌 点赞 👍 收藏 💗留言 💬 都是我最大的动力💯

在这里插入图片描述

活动地址:CSDN21天学习挑战赛


一、折半查找

折半查找(Binary Search)也称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列,二分插入排序是稳定的。元素的相对顺序在排序后不会被改变。
在这里插入图片描述

二、实现逻辑

  1. 假设表中元素是按升序排列。
  2. 将表中间位置记录的关键字与查找关键字比较。
  3. 如果两者相等,则查找成功。
  4. 否则利用中间位置记录将表分成前、后两个子表。
  5. 如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
  6. 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

三、举个例子

假设有如下经过排序的有序序列:【3 、12 、31 、42 、54 、59 、69 、77 、90 、97、99】 待查找关键字为42 。
在这里插入图片描述

(1) 取中间数据项mid 与待查找关键字42 对比, mid 项的值大千42 。因此, 42 应该在数据的前半部分。

(2) 取前半部分的中间数据项mid 与待查找关键字42 对比, mid 项的值小于42 。因此,42 应该在数据的后半部分。

(3) 取后半部分的中间数据项mid 与待查找关键字42 对比, mid 项的值小于42 。因此,42 应该在数据的后半部分。

(4) 最后数据仅剩一项,将其作为mid 与待查找关键字42 对比,正好相等,表示查找到该数据。这样,经过4 次比较便查找到42 所在的位置.

四、动态演示

下面给我动态模拟效果:

20220811_145745

五、代码实现

private static int binarySearch(int[] arr, int key){
		if(arr == null)
			return -1;
		int len = arr.length;
		if(len == 0)
			return -1;
		int low = 0;
		int high = len -1;
		int mid = low + high >> 1;
		if(key < arr[low] || key > arr[high])
			return -1;
		while(high >= low){
			if(arr[mid] == key){
				return mid;
			}else if(arr[mid]< key){
				low = mid + 1;
			}else{
				high = mid -1;
			}
			mid = low + high >> 1;
			counter ++;
		}
		return -1;
	}

六、算法评价

空间复杂度:针对这个算法,唯一的临时变量就是 while 循环的索引变量,因此空间复杂度可以认为是 0 ,且不会随着数据的长度变化而有所改变。
时间复杂度:针对这个算法,匹配成功依赖于目标在集合中的位置。如果目标在列表的中间位置,那么只需要一次比较就可以返回,所以时间复杂度是 1 ;相反的,如果目标在头部或尾部,那么最多需要进行 log(size) 次比较。


在这里插入图片描述

总结

对于在有序的数据集合中的查找操作,也可以用递归的思路实现,可以发现,当在静态不变的数据集合上有查找需求时,通过提前对该集合进行排序,然后在排好序的数据集合上执行查找,是个很好的思路。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ali.s

你的鼓励将是我前进的最好动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值