返回

只在有序数组中对目标值“快准狠”的查找——二分查找法

前端

二分查找——只在有序数组中对目标值“快准狠”的查找

二分查找法是一种高效的查找算法,它只能用于在已知数组元素由小到大排序的有序数组中查找目标值。二分查找法的平均时间复杂度为O(log n),这意味着它随着数组长度的增加而迅速增长。二分查找法通过将搜索范围不断缩小到数组的一半,从而快速找到目标值。

二分查找法的原理

二分查找法是一种基于二分思想的查找算法。其基本思想是,在已知数组元素由小到大排序的有序数组中,先比较目标值与数组中间元素的值,如果目标值等于中间元素的值,则查找成功;如果目标值大于中间元素的值,则目标值一定在中间元素右侧的一半数组中;如果目标值小于中间元素的值,则目标值一定在中间元素左侧的一半数组中。

通过这种方式,二分查找法可以将搜索范围不断缩小到数组的一半,从而快速找到目标值。

二分查找法的步骤

二分查找法的步骤如下:

  1. 将数组的左右边界设为两个指针,分别指向数组的第一个元素和最后一个元素。
  2. 计算数组的中间元素的下标,并将其与目标值比较。
  3. 如果目标值等于中间元素的值,则查找成功,返回中间元素的下标。
  4. 如果目标值大于中间元素的值,则将左边界指针设为中间元素的下标+1,并将搜索范围限制在数组的右侧一半。
  5. 如果目标值小于中间元素的值,则将右边界指针设为中间元素的下标-1,并将搜索范围限制在数组的左侧一半。
  6. 重复步骤2-5,直到找到目标值或搜索范围为空。

二分查找法的代码实现

以下是用Python实现的二分查找法代码:

def binary_search(arr, target):
  left, right = 0, len(arr) - 1

  while left <= right:
    mid = (left + right) // 2

    if arr[mid] == target:
      return mid
    elif arr[mid] < target:
      left = mid + 1
    else:
      right = mid - 1

  return -1

arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
target = 11

result = binary_search(arr, target)

if result != -1:
  print("目标值 {} 在数组中的位置是 {}".format(target, result))
else:
  print("目标值 {} 不在数组中".format(target))

二分查找法的实例

假设我们有一个有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19],并想查找其中的目标值target = 11。

  1. 将数组的左右边界设为两个指针,分别指向数组的第一个元素和最后一个元素。
left = 0, right = 9
  1. 计算数组的中间元素的下标,并将其与目标值比较。
mid = (left + right) // 2 = (0 + 9) // 2 = 4
arr[mid] = arr[4] = 9
  1. 由于目标值大于中间元素的值,将左边界指针设为中间元素的下标+1,并将搜索范围限制在数组的右侧一半。
left = mid + 1 = 5
  1. 重复步骤2-3,直到找到目标值或搜索范围为空。
mid = (left + right) // 2 = (5 + 9) // 2 = 7
arr[mid] = arr[7] = 13
  1. 由于目标值小于中间元素的值,将右边界指针设为中间元素的下标-1,并将搜索范围限制在数组的左侧一半。
right = mid - 1 = 6
  1. 重复步骤2-3,直到找到目标值或搜索范围为空。
mid = (left + right) // 2 = (5 + 6) // 2 = 5
arr[mid] = arr[5] = 11
  1. 目标值等于中间元素的值,查找成功,返回中间元素的下标。
return mid = 5

因此,目标值11在数组arr中的位置是5。