📅  最后修改于: 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) 的时间复杂度,这使其成为大型数据集中元素搜索的首选算法。在实现二分搜索时,需要将输入数组排序,并确保元素保持有序。此外,该算法需要一个递归函数来进行搜索,因此需要额外的函数调用堆栈。