数据结构与算法之二分法查找(折半查找)

🎈个人公众号:🎈 :✨✨ 可为编程 ✨✨ 🍟🍟
🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵
🍉本篇简介:🍉 本片详细说明了二分法查找(折半查找)原理与结构分析,并给出具体操作实例,如有出入还望指正。

关注公众号【可为编程】回复【面试】领取最新面试题!!!

实现查找指定数值在元素有序的数组中存储的位置(索引),返回该位置(索引)。
在这里插入图片描述

解题步骤:

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***,不管你是大学生、社畜、想学习变成的其他人员,欢迎大家加入我们,一起成长,一起进步,真诚的欢迎你,不管是技术,还是人生,还是学习方法。有道无术,术亦可求,有术无道,止于术。在这里插入图片描述

欢迎大家关注【可为编程】,成长,进步,编程,技术、掌握更多知识!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可为编程

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值