🚀个人主页:欢迎访问Ali.s的首页
⏰ 最近更新:2022年8月11日
⛽ Java框架学习系列:【Spring】【SpringMVC】【Mybatis】
🔥 Java项目实战系列:【飞机大战】【图书管理系统】
🍭 Java算法21天系列:【查找】【排序】【递归】
⛳ Java基础学习系列:【继承】【封装】【多态】
🏆 通信仿真学习系列:【硬件】【通信】【MATLAB】
🍄 个人简介:通信工程本硕🌈、Java程序员🚴。目前只会CURD😂
💌 点赞 👍 收藏 💗留言 💬 都是我最大的动力💯
活动地址:CSDN21天学习挑战赛
一、折半查找
折半查找(Binary Search)也称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列,二分插入排序是稳定的。元素的相对顺序在排序后不会被改变。
二、实现逻辑
- 假设表中元素是按升序排列。
- 将表中间位置记录的关键字与查找关键字比较。
- 如果两者相等,则查找成功。
- 否则利用中间位置记录将表分成前、后两个子表。
- 如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
- 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
三、举个例子
假设有如下经过排序的有序序列:【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) 次比较。
总结
对于在有序的数据集合中的查找操作,也可以用递归的思路实现,可以发现,当在静态不变的数据集合上有查找需求时,通过提前对该集合进行排序,然后在排好序的数据集合上执行查找,是个很好的思路。