二进制折半(也称为二分查找)是一种高效的查找算法,适用于有序数组。其核心思想是通过不断将搜索区间缩小一半来快速定位目标元素。以下是具体说明:
一、基本原理
分治策略 将有序数组分成两半,比较中间元素与目标值的大小关系,从而确定目标值位于左半部分还是右半部分,重复此过程直至找到目标或区间为空。
时间复杂度
由于每次比较后搜索区间减半,时间复杂度为O(log n),其中n为数组长度。
二、实现步骤
初始化边界
设定搜索区间的起始索引`low`和结束索引`high`,通常`low = 0`,`high = n-1`(n为数组长度)。
循环查找
当`low`小于等于`high`时,执行以下操作:
- 计算中间索引`mid = (low + high) // 2`;
- 比较`array[mid]`与目标值:
- 若相等,返回`mid`;
- 若目标值小于`array[mid]`,则将`high`更新为`mid - 1`;
- 若目标值大于`array[mid]`,则将`low`更新为`mid + 1`。
结束条件
若循环结束仍未找到目标值,返回-1表示目标不存在于数组中。
三、示例
假设有有序数组`[1, 3, 5, 7, 9]`,查找目标值`5`:
1. 初始区间为`[0, 4]`,中间值为`2`(元素`3`),目标值`5`大于`3`,更新`low = 3`;
2. 新区间为`[3, 4]`,中间值为`3`(元素`5`),找到目标值,返回索引`3`。
四、注意事项
数组必须有序: 二分查找仅适用于升序或降序排列的数组,否则结果可能错误; 处理边界情况
通过以上方法,二分查找能高效地在有序数据中定位目标元素,是计算机科学中常用的基础算法之一。