📜  二进制搜索 (1)

📅  最后修改于: 2023-12-03 14:49:02.143000             🧑  作者: Mango

二进制搜索

二进制搜索又称二分搜索(Binary Search),是一种在有序数组中查找某一特定元素的搜索算法。该算法每次查找中间元素,如果中间元素正好是目标元素则返回中间元素,否则利用中间元素将查找范围缩小一半,继续查找,直到查找到目标元素或者查找范围为空。二分搜索的时间复杂度为O(log n)。

代码实现

下面是一个使用递归方式实现的二进制搜索算法的代码示例:

def binary_search(arr, left, right, x):
    if right >= left:
        mid = (right + left) // 2
        if arr[mid] == x:
            return mid
        elif arr[mid] > x:
            return binary_search(arr, left, mid - 1, x)
        else:
            return binary_search(arr, mid + 1, right, x)
    else:
        return -1

arr = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
x = 23
result = binary_search(arr, 0, len(arr) - 1, x)

if result != -1:
    print(f"元素 {x} 在数组中的索引为 {result}")
else:
    print(f"元素 {x} 不在数组中")
代码解释

函数 binary_search 接收以下四个参数:

  • arr:要搜索的有序数组;
  • left:数组的最左边元素索引;
  • right:数组的最右边元素索引;
  • x:要找到的目标元素。

在函数的第一行,我们判断传入的索引范围是否有效,当 right 指针大于等于 left 指针时,就可以继续搜索。接下来我们计算 mid 索引,该索引指向数组的中心元素。如果找到了目标元素,我们直接返回索引值 mid。如果中心元素比目标元素大,那么我们继续搜索左半部分数组,否则我们继续搜索右半部分数组。最后,如果我们没有找到目标元素,我们返回 -1

在我们的示例中,我们声明了一个有序数组 arr,并将目标元素 x 设置为 23,该元素在数组中索引为 5。我们使用递归方式将 arr、左索引 0、右索引 9 和目标元素 23 传递给函数 binary_search,该函数返回 5。最后,我们打印结果 "元素 23 在数组中的索引为 5"

总结

二进制搜索算法是一种高效有序数组搜索算法,具有 O(log n) 的时间复杂度,这使其成为大型数据集中元素搜索的首选算法。在实现二分搜索时,需要将输入数组排序,并确保元素保持有序。此外,该算法需要一个递归函数来进行搜索,因此需要额外的函数调用堆栈。