二分搜索

综述

二分搜索算法用于高效地在有序数组A中查找一个目标值v。 和线性搜索不同,二分搜索利用数据结构中的信息让搜索更高效。高效算法的关键是信息。

二分搜索算法的原理

不断地将搜索空间分成两半, 并且把搜索空间限制在其中的一半中。这个算法通过改变上下界限有效地限制搜索空间。上界(IndexHigh)标记了搜索空间有效数组中最高的索引,下界(IndexLow)标记了搜索空间有效数组中最低的索引。
通过这个算法,如果目标值在这个数组中,就可以保证:
A [ I n d e x L o w ] ≤ v ≤ A [ I n d e x H i g h ] A[IndexLow] ≤ v ≤ A[IndexHigh] A[IndexLow]vA[IndexHigh]
在搜索的每一步中,我们只需依次判定上界和下界中间的值:
I n d e x M i d = I n d e x H i g h + I n d e x L o w 2 IndexMid=\frac{IndexHigh+IndexLow}{2} IndexMid=2IndexHigh+IndexLow
接下来,我们将中间值 A[IndexMid] 和目标值 v 进行比较。
如果中间值小于目标值(A[IndexMid] < v),我们就知道目标值一定介于这个中间值之后。这样我们可以将IndexLow改为 IndexMid + 1 来使搜索空间又变成原来的一半。
如果中间值比目标值大(A[IndexMid]>v),我们就知道目标一定位于中间值之前,于是我们将IndexHigh改为IndexMid-1 来使得搜索空间变成原来的一半。
当然,如果我们发现A[IndexMid]等于v,我们可以直接结束搜索,找到目标值。

例子

使用二分搜索在下面这个已排序的数组中寻找到15

第一个被判定的中点的值是11,比我们的目标值15小。因为我们知道这个数组是按照升序排列的,所以可以排除中点及其之前的所有部分。我们将下界索引移动到适当的地方 (IndexLow = IndexMid + 1)。

在第二次比较之后,我们发现中点值是52,比目标值大。 我们可以排除中点和它之后的所有部分。此时需要移动我们上界(IndexHigh = IndexMid -1)。

请注意,通过这几次的操作,此时虽然下界已经是目标值了(v=15),但是我们仍需要继续搜索,直到中间值指向目标值。这是因为二分搜索是对中间值进行判定,而不会判定上界和下界是否是目标值。

如果目标值不在数组中会发生什么呢?在搜索过程中,上下界之间的距离会越来越近,直到它们之间没有任何还未检查过的值。因为我们总是将其中一个界限移动到中间值的另一边, 所以我们可以在IndexHigh < Indexlow的时候停下来,这个时候就可以保证目标值不在数组中了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值