返回

二分查找:20 分钟掌握的快速搜索算法

前端

二分查找是一种非常高效的搜索算法,其时间复杂度为 O(log n)。它适用于已排序的数组或链表,通过不断地将搜索范围折半来快速找到目标元素。

二分查找的原理

二分查找的原理非常简单。假设我们有一个已经排序好的数组 arr,其中包含 n 个元素。我们首先将数组的中间元素 arr[n/2] 与目标元素 target 进行比较。如果 arr[n/2] 等于 target,那么我们就找到了目标元素。如果 arr[n/2] 小于 target,那么目标元素一定在 arr[n/2+1] 到 arr[n-1] 之间。如果 arr[n/2] 大于 target,那么目标元素一定在 arr[0] 到 arr[n/2-1] 之间。

根据比较结果,我们将数组的搜索范围缩小到一半。然后,我们继续对新的搜索范围执行二分查找,直到找到目标元素或搜索范围为空。

二分查找的步骤

  1. 首先,将数组的中间元素 arr[n/2] 与目标元素 target 进行比较。
  2. 如果 arr[n/2] 等于 target,那么我们就找到了目标元素。
  3. 如果 arr[n/2] 小于 target,那么目标元素一定在 arr[n/2+1] 到 arr[n-1] 之间。
  4. 如果 arr[n/2] 大于 target,那么目标元素一定在 arr[0] 到 arr[n/2-1] 之间。
  5. 根据比较结果,我们将数组的搜索范围缩小到一半。
  6. 然后,我们继续对新的搜索范围执行二分查找,直到找到目标元素或搜索范围为空。

二分查找的代码实现

def binary_search(arr, target):
  """
  二分查找算法

  参数:
    arr: 已排序的数组
    target: 要查找的目标元素

  返回:
    目标元素在数组中的索引,如果找不到则返回 -1
  """

  low = 0
  high = len(arr) - 1

  while low <= high:
    mid = (low + high) // 2
    if arr[mid] == target:
      return mid
    elif arr[mid] < target:
      low = mid + 1
    else:
      high = 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(f"目标元素 {target} 在数组中的索引为 {result}")
else:
  print("目标元素不存在")

二分查找的应用场景

二分查找是一种非常实用的算法,它有广泛的应用场景。例如:

  • 在排序好的数组中查找元素
  • 在二叉搜索树中查找元素
  • 在文件系统中查找文件
  • 在数据库中查找记录
  • 在网络中查找主机

结语

二分查找是一种非常高效的搜索算法,其时间复杂度为 O(log n)。它适用于已排序的数组或链表,通过不断地将搜索范围折半来快速找到目标元素。二分查找的原理非常简单,易于理解和实现。它在许多应用场景中都有着广泛的应用。