🎈个人公众号:🎈 :✨✨ 可为编程 ✨✨ 🍟🍟
🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵
🍉本篇简介:🍉 本片详细说明了二分法查找(折半查找)原理与结构分析,并给出具体操作实例,如有出入还望指正。关注公众号【可为编程】回复【面试】领取最新面试题!!!
实现查找指定数值在元素有序的数组中存储的位置(索引),返回该位置(索引)。
解题步骤:
1.定义3个用来记录索引值的变量,变量min记录当前范围最小索引值,初始值为0;变量max记录当前范围最大索引值,初始值为数组长度-1;变量mid记录当前当前范围最中间元素的索引值,初始值为(min+max) / 2
2.使用循环,判断当前范围下,最中间元素值与指定查找的数值是否相等
若相等,结束循环,返回当前范围最中间元素的索引值mid
若不相等,根据比较结果,缩小查询范围为上一次查询范围的一般
中间元素值 比 要查询的数值大,说明要查询的数值在当前范围的最小索引位置与中间索引位置之间,此时,更新查询范围为:
范围最大索引值 = 上一次中间索引位置 -1;
中间元素值 比 要查询的数值小,说明要查询的数值在当前范围的最大索引位置与中间索引位置之间,此时,更新查询范围为:
范围最小索引值 = 上一次中间索引位置 +1;
在新的查询范围中,更新中间元素值的位置,再次使用最中间元素值与指定查找的数值是否相等。
中间索引值 = (范围最小索引值 +范围最大索引值) / 2;
3.每次查询范围缩小一半后,使用if语句判断,查询范围是否小于0个元素,若小于0个元素,则说明指定数值没有查询到,返回索引值-1。
//非递归 循环
/* public int checkNum(int[] nums,int num){
int min = 0;//最小标
int max = nums.length-1;//最大下标
// int med = 0;//中间
while (min<=max){
//位运算比除法快
int med = (min+max) >>1;
if(nums[med] > num){
max = med - 1;
}else if(nums[med] < num){
min = med +1;
}else{
return med;
}
}
return -1;
}
*/
//递归实现
public int diguicheck(int[] nums, int num,int min,int max) {
if (min > max) {
return -1;
}
//位运算比除法快
int mid = (min + max) >> 1;
if (nums[mid] > num) {
max = mid - 1;
return diguicheck(nums,num,min,max);
} else if (nums[mid] < num) {
min = mid + 1;
return diguicheck(nums,num,min,max);
} else {
return mid;
}
}
public static void main(String[] args) {
DichotomyOp dichotomyOp = new DichotomyOp();
int[] nums = new int[]{9, 12, 15, 18, 20, 25, 30, 38, 60, 79};
int value = dichotomyOp.diguicheck(nums, 38,0,nums.length-1);
System.out.println(value);
}
欢迎感兴趣的小伙伴一起探讨学习知识,以上是个人的一些总结分享,如有错误的地方望各位留言指出,十分感谢。觉得有用的话别忘点赞、收藏、关注,手留余香! 😗 😗 😗
这里是一个真诚的***青年技术交流QQ群:761374713***,不管你是大学生、社畜、想学习变成的其他人员,欢迎大家加入我们,一起成长,一起进步,真诚的欢迎你,不管是技术,还是人生,还是学习方法。有道无术,术亦可求,有术无道,止于术。
欢迎大家关注【可为编程】,成长,进步,编程,技术、掌握更多知识!