码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构与算法之折半查找


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

     作者简介:大家好我是小唐同学(๑>؂<๑),为梦想而奋斗的小唐,让我们一起加油!!!

    个人主页:小唐同学(๑>؂<๑)的博客主页

    系列专栏:数据结构

    博友们如果也是新手入门数据结构我希望大家可以多加练习 数据结构题库在牛客网就有已经给大家附上链接,可以直接点击跳转:刷题点这里

    牛客网支持ACM模式哦,刷算法题也很推荐哦!!!

    下面上文章------》

    目录

    折半查找概念:

    折半查找步骤:

    1.输入:

    2.输出

    算法思想:

    算法图解:

    代码实现:

    时间复杂度分析:

       (1)最坏情况:

       (2)最好情况:

       (3)平均情况:

    空间复杂度:


    折半查找概念:

    折半查找也称为二分查找,是一种效率比较高的查找算法,但是这是在该序列已经有序的状态下,因为该算法的核心思想就是缩小搜索区间,也要保持在元素不遗漏的状态下。

    折半查找步骤:

    1.输入:

    (1)n个数(有序数列--升序) 

    (2)待查找元素

    2.输出

    查找成功:返回该元素在有序数列中的下标

    查找失败:返回-1或自定义失败的标识

    算法思想:

    核心思想就是不断缩小搜索范围,在缩小范围时你会遇到三种情况

    1.与目标值相等:直接返回对应下标,结束

    2.比目标值大:因为数列有序 则中值元素在目标值的后边,搜索区间减半(在左一半),再算出减半后的区间的中值进行比较,以此类推。

    3.比目标值小:由于元素有序,则中值元素在目标值的前边,搜索区间减半(在右一半),再算出减半后的区间的中值进行比较,以此类推。

    如果区间两端点重合且端点值不相等则表示查找失败。

    算法图解:

    图片来自《数据结构简明教程》

     

     第一次查找:mid坐标为4,对应元素为10,大于7,则区间变为左一半:[0,3];

     第二次查找:mid坐标为1,对应元素为1,小于7,则区间变为右一半:[0,3];

     第三次查找:mid坐标为2,对应元素为7,等7,返回下标:mid+1=3;

    代码实现:

    1. # include
    2. int main()
    3. {
    4. int a[7];
    5. int n;
    6. printf("请输入要查找的元素");
    7. scanf("%d",&n);
    8. printf("请输入数组元素");
    9. for(int i=0;i<7;i++)
    10. {
    11. scanf("%d",&a[i]);
    12. }
    13. //存储变化的区间右端点
    14. int r=6;
    15. //存储变化的区间左端点
    16. int l=0;
    17. int mid;
    18. while(l<=r)
    19. {
    20. mid=(r+l)/2;
    21. if(a[mid]==n)
    22. {
    23. printf("%d",mid);
    24. return mid;
    25. }
    26. if(a[mid]
    27. {
    28. l=mid+1;
    29. }
    30. if(a[mid]>n)
    31. {
    32. r=mid-1;
    33. }
    34. }
    35. return -1;
    36. }

    时间复杂度分析:

       (1)最坏情况:

    最后一次才找到 设次数为t 因为每次缩小1/2    所以2^t=n;

    则t=㏒₂n   则时间复杂度相当于对数级别O(㏒₂n )

       (2)最好情况:

    一次找到,则时间复杂度为常数级别O(1);

       (3)平均情况:

    综合则二分查找时间复杂度为O(㏒₂n )。

    空间复杂度:

    因为只需要几个固定变量则空间复杂度为常数级:O(1)。

  • 相关阅读:
    Typecho框架漏洞
    丁鹿学堂:前端面试手写系列之promise(一)
    Hadoop 3.0.0 (单机版)安装与配置与基础使用
    优化软件测试成本的 7 个步骤
    我们距离“裸眼3D自由”,还有多远?
    计算机视觉 | 交通信号灯状态的检测和识别
    抽象类和接口的区别
    SpringCloud-Stream
    贪心算法专题小结——区间相关问题
    「python」关于sympy的使用笔记
  • 原文地址:https://blog.csdn.net/m0_61469860/article/details/126275175
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号