Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 225|回复: 0

[默认分类] 二分查找算法

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-10 13:41:32 | 显示全部楼层 |阅读模式
        二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
        1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
        2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
        二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。


      #include
      <
      iostream
      >
      

      using
      namespace
       std;


      //
      二分查找
      

      int
       binary_search(
      int
      *
       a,
      int
       len,
      int
       goal);


      int
       main()
    {

          const
      int
       LEN
      =
      10000
      ;

          int
       a[LEN];

          for
      (
      int
       i
      =
      0
      ; i
      <
       LEN; i
      ++
      )
            a
      =
       i
      -
      5000
      ;

          int
       target
      =
      0
      ;

          int
       index
      =
       binary_search(a, LEN, target);


          if
      (index
      !=
      -
      1
      )
            cout
      <<target
      <<
      "
      在数组中的下标为
      "
      <<
      index
      <<
      endl;

          else
      
            cout
      <<
      "
      不存在
      "
      <<target
      <<
      endl;

          return
      0
      ;
    }


      int
       binary_search(
      int
      *
       a,
      int
       len,
      int
       goal)
    {

          int
       low
      =
      0
      ;

          int
       high
      =
       len
      -
      1
      ;

          while
      (low
      <=
       high)
        {

              int
       middle
      =
       (high - low) / 2 + low
      ; // 直接使用(high + low) / 2 可能导致溢出

              if
      (a[middle]
      ==
       goal)

                  return
       middle;

              //
      在左半边
      

              else
      if
      (a[middle]
      >
       goal)
                high
      =
       middle
      -
      1
      ;

              //
      在右半边
      

              else
      
                low
      =
       middle
      +
      1
      ;
        }

          //
      没找到
      

          return
      -
      1
      ;
    }


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-25 09:25 , Processed in 0.401147 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表