二分查找(基础)

前言

目前正在学算法基础,由于需要二分查找,同时又记不住怎么写(理解不深透),于是写下这篇文章

如有错误,望各位指点纠正。  OvO


 

一、二分查找主体

二分查找函数模板:

int found(int l, int r,int v) {          while (l < r) {               int m=(l+r)/2;               if (a[m]>v) r = m;            else if (a[m]<v)l = m + 1;          else  return m;          }      return -1;}

二、 二分查找解析

1、过程动态分析

  实例:通过二分查找,找到 v 在数组中的对应值  (v=34)       

 初始状态: l(左边界) 、r(右边界)位于开头和末尾处,m(中值) 位于数组中间。

cf3c38da341c4db993dc4c764f681153.gif

 

第一次查找: 首先对比发现 v 小于 m,可得出数组对应值应在其左侧,然后将前中值设为 r (右边界),使得范围发生变化,从而缩小了查找的区间。

db773b611cf04efa9830de85e0f88dd5.gif

 

 

 第二次查找: v 仍然小于 m,将前中值设为 r ,再一次缩小区间。

 289d48d2ce8b4091845b81fce216574d.gif

第三次查找: v 大于m, 可得出数组对应值应在其右侧,将前中值往右一位设为 l。

0534c49b50f44fe7809ab6a1b2456d07.gif

 在第三次查找后,m 与 l 重合(因为(l+r)/2会舍弃小数部分,得到的也就是l), 对比可得 v 大于 m,则 l 变为 m+1,也就是 l 与 r 相等,因此退出循环,函数 return -1

 2、解析二分模板

       while (l < r)      找不到时跳出循环

          int m=(l+r)/2;    设立中值(用于判断位置)

         if (a[m]>v) r = m;     更改右边界

        else if (a[m]<v)l = m + 1;    更改左边界

        else  return m;    找到后直接返回函数

     return -1;   说明数组中不含其对应值

更改左边界时为何要加1? 

 

 

 

cb35b8c064d249d5ad8506e11c60ac65.gif

假设对应值位于 [ m , r ] 之间,如上图所示,改变左边界, l 与 m 重合 

a9bc288ea1704f77a9db69eaa553d5ba.gif


 首先之前可知 ( l + r )/2为 l,也就是 m 不变。

因为v 仍然大于 m,所以改变 l。l 改变后为 m,导致查找后重复不变,并且过程中 l 始终小于 r ,因而进入死循环。

 


总结

二分查找精髓在于通过缩小区间方法进行查找,更改左右边界要符合条件,防止进入死循环,同时左右边界可以为其他条件,进行不同问题的二分查找


 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kk_阿白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值