二分查找(折半查找)是一种高效的查找算法,它的工作原理是每次取中间元素与目标值比较,如果目标值大于中间元素,则在中间元素右侧继续查找;如果目标值小于中间元素,则在左侧查找。这个过程会持续进行,直到找到目标值或者搜索范围缩小到零。这种查找方法的前提是线性表必须是顺序存储并且按照关键字(如升序或降序)进行了排序。
然而,二分查找并不适合频繁的插入或删除操作,因为这些操作会打乱已排序的顺序,可能导致查找效率降低。对于动态变化的线性表,如链表,更适合使用顺序查找,因为链表的插入和删除操作相对简单,不需要移动大量元素。而对于那些数据稳定且需要频繁查找的线性表,二分查找则是一个理想选择。
二分查找(折半查找)的工作原理如下:
-
开始定位:从有序序列的中间元素开始,假设我们有一个已排序的数组,比如
[1, 3, 5, 7, 9, 11, 13]
。 -
比较与分割:计算中间元素的索引,如
mid = (low + high) // 2
,在这个例子中,初始low = 0
和high = len(array) - 1
。第一次查找时,mid = 3
,中间元素是5
。 -
判断目标:比较目标值
target
与中间元素array[mid]
。如果target > array[mid]
,说明目标可能在右半部分,将low = mid + 1
;如果target < array[mid]
,则目标可能在左半部分,将high = mid - 1
。 -
递归或循环:重复上述步骤,直到找到目标元素或搜索区间
low
大于high
,表示目标不存在。 -
结束条件:当
low
和high
相等时,array[low]
就是目标值,查找完成。
举个例子:
假设目标值是 `23`,查找过程如下:
- 第1次:low=0, high=6, mid=3, 5(中间)> 23,low=3
- 第2次:low=3, high=3, mid=3, 5(中间)= 23,找到了,结束查找。
因此,二分查找在第2次比较后就找到了目标 `23`。
二分查找法(Binary Search)主要适用于已排序的数组数据结构。这种算法利用数组元素的有序性质,通过不断将搜索区间缩小一半来定位目标元素。例如,在一个有序的整数数组{1,2,3,4,5}中查找特定值4,二分查找法可以在最多log2(n)步内完成,对于大型数据集,这显著提高了查找效率。其时间复杂度为O(log2 n),这意味着它在处理大规模数据时非常高效。