码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 查找算法——二分查找


    目录

    ​一、算法介绍

    1.算法思想

    2.算法流程

    二、算法实现

    1.代码实现

    2.测试用例及结果

    三、性能分析

    1.时间复杂度

    2.空间复杂度


    ​一、算法介绍

    1.算法思想

    二分查找也称折半查找,是一种效率比较高的查找算法,但是运用前提是查找的序列已经有序。其核心思想就是利用序列有序的特点,每次对序列中间元素进行比较,判断其与待查找元素的大小关系,来确定待查找元素是否是当前元素,或是在当前元素的左半部分还是右半部分,从而每次比较都能够淘汰一半的元素,缩小查找区间,所以其拥有较高的查找效率。

    2.算法流程

    示例:给定序列{1,2,3,4,5,6,7,8,9},查找元素3。

    每次比较后,若没有查找到待查找元素,都需要根据比较结果改变查找区间一侧边界,然后更新mid的位置,再进行下一次查找。

    二、算法实现

    1.代码实现

    1. #include
    2. using namespace std;
    3. //成功:返回下标 失败:返回-1
    4. int BinarySearch(int* arr, int size, int key) {//二分查找
    5. int left = 0;
    6. int right = size - 1;
    7. while (left <= right) {//注意等于时,也需要比较
    8. int mid = (left + right) / 2;
    9. if (arr[mid] < key) {
    10. left = mid + 1;
    11. }
    12. else if (arr[mid] > key) {
    13. right = mid - 1;
    14. }
    15. else {//查找成功
    16. return mid;
    17. }
    18. }
    19. return -1;//查找失败
    20. }
    21. void Test() {
    22. int arr[] = { 1,2,3,4,5,6,7,8,9 };
    23. int size = sizeof(arr) / sizeof(arr[0]);
    24. int key;
    25. cout << "请输入待查找元素:";
    26. cin >> key;
    27. int index = BinarySearch(arr, size, key);
    28. if (index == -1) {
    29. cout << endl << "没有待查找元素!" << endl;
    30. }
    31. else {
    32. cout << endl << "元素" << key << "所在位置下标为:" << index << endl;
    33. }
    34. }
    35. int main() {
    36. Test();
    37. return 0;
    38. }

    2.测试用例及结果

    序列:1,2,3,4,5,6,7,8,9

    查找元素3:

    查找元素:9

     

    查找元素:10

     

    查找元素:0

     

    三、性能分析

    1.时间复杂度

    最坏情况O(log_{2}^{n}):

    根据算法思想可知,最坏情况即最后一次比较才找到待查找元素,也即是left与right重叠,查找区间内只剩一个元素时。根据算法思想每次淘汰一半元素可知,就相当于每次查找区间内元素减少一半,减少几次后只剩1个元素即最大的查找次数,即log_{2}^{n}次,所以最坏情况下的时间复杂度为

    O(log_{2}^{n})

     最好情况O(1):

    最好情况即只需要比较一次就找到待查找元素,根据算法思想可知此时待查找元素刚好位于序列的中间位置,所以最好情况下的时间复杂度为O(1)。

    平均情况O(log_{2}^{n}):

    综合两种情况,二分查找的时间复杂度为O(log_{2}^{n})。

    2.空间复杂度

    O(1)

    由于算法中只设置了几个临时变量用于限定查找区间和查找元素,并没有借助额外的辅助空间,所以空间复杂度为O(1)。
    ​

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

  • 相关阅读:
    MyBatis-plus 分页功能实现
    异地组网-zerotier
    java计算机毕业设计双峰县在线房屋租售网站源码+系统+数据库+lw文档+mybatis+运行部署
    制作一个简单HTML宠物猫网页(HTML+CSS)
    【推荐系统中的Hash 2】局部敏感哈希(利用冲突)
    论文解读:《DeepKla:一种基于注意力机制的深度神经网络,用于蛋白质赖氨酸乳酸化位点预测》
    Go语言基础之接口
    8月外贸新规
    推荐一个react上拉加载更多插件:react-infinite-scroller
    Linux文本三剑客---awk
  • 原文地址:https://blog.csdn.net/m0_63020222/article/details/126236527
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号