折半查找(二分查找)

今天学习到了二分查找,也叫折半查找。之前已经接触了这个知识,但那时候只是知道了原理,并没有实现代码的输出。今天完成了代码的输出,使用二分查找查找你想查找的数。

注意折半查找只适用于有序的数组。

折半折半,顾名思义需要找到中间那个数加上左右俩个数进行配合,一半一半的减少查找范围,所以叫做折半查找,具体过程是这样的。

  1. 首先我们先设置好左右俩边,才能去找到中间的数值。这里我采用的sizeof去求数组具体包含多少数据,虽然我可以一个个去数到底有几个数据,目前来说这样可能更加便捷。但是你以后如果要处理成百上千的数据的时候,不可能也一个个这样去数吧,所以我们现在这里养成这样的好习惯,这样才会让你的代码通用性,实用性,可维护性更强一些。不至于增加几个数据,你就得改代码了。

这里的设left = 0,应该都知道数组的下标是从0开始的,就不多解释了。

  1. 再接着到设置mid了,这里有个小细节可以注意一下。

普通的是不是这样就可以找到mid了。这样目前也没什么错误,但是我们要注意了,已知我们的int数据是有上限的,如果left 和right的数据相加超过这个限制的时候,就会导致一部分的数据丢失。还是刚才的话,现阶段可能不会造成这个影响,但你以后处理的数据就不好说了。还是一个好习惯的问题。那么我们该如何解决这个问题呢?很简单:

这样看可能会有点抽象,我们把它转化成模型看一下。

可以看到一开始的right和left的状态是这样的,它们直接相加在一起就超出界限了,那么该如何找到它们的中间值呢。可以看到:

如图所示,我把right多出来的那一部分求出来,也就是俩个相减。再把这一部分的一半加到left上面是不是right和left就相等了,实现了不用加法的平分,找到mid。额外说一点因为我这里采用的是循环,left或者right会不断的改变,会出现到left大于right的,这个时候mid一样是可以找到的,这就是关于数学部分了,我就不多赘述了。

  1. 准备过程结束,接着就是查找了。第一种情况就是你查找的数字要大于mid的值,因为数组是有序的,所以你查找的值如果存在就一定在mid的右边,这个时候你原来的left的值就要发成改变了,变到mid的右边,也就是left = mid +1 ;然后再重新找到mid值。如图:

你可能会有点疑惑,为什么mid指向7,而不是8。因为mid是int型,而left和right的下标相除所得是6.5,你只能读取到6,所以指向的是7。接下来再重复刚才的操作,如果找到了就用brake跳出循环,同时把flag赋为1,让程序判断你是否成功。如果失败,那么flag值还是0,就会显示没有找到这个数。

这个是mid的值大于你要找的值的情况,大同小异。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值