二分查找算法
二分查找算法,也称为折半查找,是一种在有序数组中查找特定元素的高效算法。它的工作原理是通过不断地将搜索区间减半来缩小目标值可能存在的范围,直至找到目标值或确定目标值不存在于数组中。二分查找的关键在于每次比较都能排除掉一半的元素,因此其时间复杂度为 O(log n),其中 n 是数组的长度。
基本流程:
- 确定数组的中间元素。
- 如果中间元素正好是要查找的目标值,则查找成功。
- 如果中间元素比目标值大,那么只在数组的左半部分继续查找。
- 如果中间元素比目标值小,那么只在数组的右半部分继续查找。
- 重复步骤1至4,直到找到目标值或搜索区间为空。
二分查找的条件:
- 数组必须是有序的。
- 数组最好是采用顺序存储结构。
实现细节:
在实现二分查找时,通常有两种方式处理边界条件:
- 闭区间版本:使用两个指针,left 和 right,初始时 left = 0, right = n - 1,并在循环内更新 left 和 right 的值,直到 left > right。
- 开区间版本:使用两个指针,low 和 high,初始时 low = 0, high = n,并在循环内更新 low 和 high 的值,直到 low >= high。
复杂度分析:
- 时间复杂度:平均和最坏情况下都是 O(log n)。
- 空间复杂度:O(1),因为除了输入数组外,只使用了几个变量。
代码示例
def binary_search(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = left + (right - left) // 2 # 防止(left + right)可能引起的整数溢出if nums[mid] == target:return mid # 找到目标值,返回索引elif nums[mid] < target:left = mid + 1 # 目标值在右侧子数组else:right = mid - 1 # 目标值在左侧子数组return -1 # 没有找到目标值# 使用数组和目标值调用函数
nums = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
target = 13index = binary_search(nums, target)if index != -1:print(f"目标值 {target} 的索引位置 {index}.")
else:print(f"目标值 {target} 未找到.")