【C语言二分查找法详解】(含图文)

目录

一、二分查找的基本思路​

二、二分查找法的使用条件​

三、二分查找的代码的实现及讲解​

1.第一步

2.第二步 

3.第三步 

 4.第四步


 

一、二分查找的基本思路🎉

        在一段升序的数组中我们想要找到一个数字,最容易想到的是依靠遍历数组的方式找到这个数字,但是这种方式效率太慢了,如果是一个很大的数组,例如有1万个数字或者10万个数字,那岂不是需要查找1万次或者10万次吗?这个查找的次数是很大的,效率是很慢的,所以今天我将为大家讲解一种方式叫做二分查找法,也可以称为折半查找法,它的效率是很高的,能够很快的为我们找到某一个数字,它的基本思路就是找到一个mid的中间值与我们要查找的数字k进行比较,初步判断k所在的范围。(举个生活中的例子:比如我买了⼀个东西,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4...这样猜吗?显然很慢;⼀般你都会猜中间数字,比如:150,然 后看大了还是小了,这就是⼆分查找,也叫折半查找。)

二、二分查找法的使用条件🎉

   二分查找法一定是使用在一段升序或降序的数字中的(例如1,2,3,4,5,6,7,8,9,10),不能够是乱序,乱序是无法使用二分查找的。这里你可能会有疑问,为什么不能是乱序呢?例如有一串数字是(4,7,6,3,1,5,8,2,9)这里面的中间数字是1,而我们假如要找3这个数字,1和3比较的话1肯定是比3小的所以按照道理我们是去找1右边的数字舍去1左边的所有数字,但是由于这是个乱序的一串数字,3结果跑到了1的左边,显然如果我们按照这种方式就错了,所以在乱序的情况下我们是无法使用二分查找的。

三、二分查找的代码的实现及讲解🎉

     上满我们简单的讲述了二分查找的基本思路和使用条件,接下来我们就通过实现二分查找的代码在下面的10个数字找到7这个数字吧。e6649b0e2ffb41059807a1b762d56182.png

1.第一步

     首先我们肯定是需要有这10个数字的序列,才能查找其中的元素,所以这里我们使用数组创造出10个元素。

1539776cc8f44728883044822cd131fb.png

2.第二步 

     要运用二分查找我们肯定需要找到该序列的一个中间元素 ,那么我们应该怎么实现呢?这里我们可以有一个思路:由于我们这个序列是一个数组,数组是有下标的,现在我们可以找到该序列最左边的元素下标和最右边的元素下标,两者加起来/2就是中间元素的下标了,为此我们需要创建三个变量分别来记录最左边,中间,及最右边的下标(left,mid,right)。

ae5ce46fbce84c6e81209100c463d6ee.png

代码的实现: 

ad1d8f4030794c149704def17db3bb3e.png

3.第三步 

        这里我们就要输入一个数字来与我们中间的元素进行比较了,这里我们假设输入的数字input为7,而7>5(中间元素),所以目前mid下标极其它左边所有下标代表的元素就肯定不会是7了,所以我们就要重新划分范围了,原来mid本身所代表的元素及其左边的所有元素全部舍去,舍去之后我们现在最左边的元素就是mid+1了(left=mid+1),而我们最右边的下标right继续保持不变,

0e81677643674fefa57b9bf4518b7cce.png

019696fcd33f40ce8e1e13e732e3e57e.png

然后我们重新找到mid这个中间元素mid=(left+right)/2((5+9)/2))为7,所以现在mid这个下标为7。 

b991b9e4b0cd4d56866ee559302cd011.png

( 当然除了上面这种中间元素mid<input以外,还会有中间元素>input的情况,当然如果等于的话就肯定是找到了,那么中间元素mid>input的情况是什么样的呢?其实跟上面的判断方式一样,无非就是左边的left不变,mid下标的元素及其它右边的所有元素舍去之后也重新划分范围,划分之后的右下标right=mid-1)

代码的实现:

8f002bc986f7499eb0b5415f2d3f8728.png

 4.第四步

      上面我们的代码只是实现查找了一次,但并没有找到,这显然是不够的,我们肯定要查找多次直到找到我们需要的这个元素,所以我们这里就需要利用循环体,可是我们循环体的条件又是什么呢?如果我们没有找到的话,该怎么跳出这个循环呢?这是我们现在需要考虑的问题!这里我们先试着用图来表示试着循环下去分析一下吧 !

这是我们目前的情况:

b991b9e4b0cd4d56866ee559302cd011.png

 现在我们发现mid下标所代表的元素>input,所以我们又要重新划分范围,left不变,重新找到mid和right这两个下标,right=mid-1,mid=(left+right)/2,所以新的mid和right分别为5和6:

303de33395894257a1afdd92964caa59.png

f051d5c505de4b4f9c86adbd01918c2d.png

 然后我们接着继续比较,mid下标的元素<input,所以我们接着按照前面的方式重新划分范围:

d1883735677a4a04bd6e43be231e7c4c.png

32356f316c1843bc85bbfb40b5b7d2e9.png

最后我们接着比较,发现mid所代表的元素与我们输入的元素input相等了,那么此时代表着我们已经找到目标了,到这里我们不难发现 ,当left=right就是最后一次的循环,如果此时还找不到的话,就说明这个序列里面是没有目标元素的,也就找不到了,所以循环的条件为

(while(left<=right))

代码的实现:

d4163b96e02240f5a420baf2691cd21e.png
 5.第五步

      上面我们只是考虑了找到的情况,而没有找到的情况还没写,所以我们代码还没写完,这里我们思考一下没有找到的条件是什么?其实不难发现,当如果right<left的时候,那我们肯定就找不到了,当我们加上最后这个条件之后,我们整个代码就算完成了!所以代码的实现如下: 

50091b6ff93e4b2b95b7270afe2fbefe.png

程序运行结果:

94b28f27061347b39a2761b1fe8995bf.png

bd0ca55e30a847d3a446bd6a670c7d37.png

        这就是二分查找的所有内容,其实不难发现当学习一种算法的时候我们可以通过画图的方式来更加直观的去理解学习,光是通过想的话其实不够清晰的,所以推荐大家在学习算法的时候多画图去理解,方便我们的理解与学习。好了如果看到这里的话,你觉得还不错,不妨为我点赞、评论、收藏支持一下,谢谢大家。

8564d1c0b7f141baa8a370388d94632b.jpeg

 

 

 

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值