二分查找-BinraySearch总结
二分查找-BinraySearch总结
前言
二分查找(Binary Search)是一种从有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。 如果在某一步骤数组为空,则代表找不到。
算法实现(python)
while 循环写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def binary_search(nums: List[int], target: int):
left = 0
right = len(nums)-1
while left <= right:
mid = left + (right-left) // 2
if target < nums[mid]:
right = mid-1
elif target > nums[mid]:
left = mid+1
else:
return mid
return -1
递归写法
以下是一个简单的二分查找算法的 Python 实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def binary_search(arr, target):
# 定义左右指针
left = 0
right = len(arr) - 1
# 当左右指针没有相遇时循环查找
while left <= right:
# 计算中间位置
mid = (left + right) // 2
# 如果中间位置的值等于目标值,则找到了目标值,返回该位置
if arr[mid] == target:
return mid
# 如果中间位置的值大于目标值,则在左半部分继续查找
elif arr[mid] > target:
right = mid - 1
# 如果中间位置的值小于目标值,则在右半部分继续查找
else:
left = mid + 1
# 如果没有找到目标值,返回 -1
return -1
上述代码中,arr 表示要查找的有序数组,target 表示要查找的目标值。算法首先定义左右指针,初始值分别为数组的开头和结尾。然后,算法在每一次循环中计算中间位置,比较中间位置的值和目标值的大小,如果中间位置的值等于目标值,则找到了目标值,返回该位置;如果中间位置的值大于目标值,则在左半部分继续查找;如果中间位置的值小于目标值,则在右半部分继续查找。如果没有找到目标值,返回 -1。
优化版
以下是一个稍微优化了一些的二分查找算法的 Python 实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
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
相比之前的实现,这个实现使用了更紧凑的语法,同时还进行了一些微小的调整。具体来说,这个实现:
- 使用了 Python 的多重赋值语法,将
left和right初始化到同一行。 - 将
if和elif语句中的比较运算符方向调整了一下,使得arr[mid] < target和arr[mid] > target分别对应左半部分和右半部分的查找。 - 将
if语句中的return改为了elif,避免了不必要的判断。这个改动是安全的,因为如果arr[mid] == target,那么if语句就会被执行,而不会执行elif语句。
虽然这些改动对算法的时间复杂度没有影响,但它们可以让代码更加清晰和易读。
本文由作者按照 CC BY 4.0 进行授权