使用python函数实现二分查找
二分查找(Binary Search),也称折半查找,是一种效率较高的查找方法。它要求待查找的序列有序,每次取中间位置的值与待查关键字进行比较,如果中间位置的值比待查关键字大,则在序列的左半部分继续执行查找;如果中间位置的值比待查关键字小,则在序列的右半部分继续执行查找,直到查找到目标位置或者查找范围为空。
下面,我们就使用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
上述代码中,我们定义了一个binary_search函数,它接受两个参数:待查找的序列arr和待查找的目标值target。我们使用left和right两个指针来表示待查找序列的左右端点。在每一轮查找中,我们计算出中间位置的下标mid,并判断中间位置元素值与目标值的大小关系。如果中间位置元素值等于目标值,那么找到目标位置,直接返回mid;如果中间位置元素值小于目标值,那么想要找到目标值,需要查找序列的右半边,因此将left指针右移;如果中间位置元素值大于目标值,那么想要找到目标值,需要查找序列的左半边,因此将right指针左移。如果整个查找过程中,找不到目标位置,那么返回-1。
上述代码中使用了while循环和if语句这两种基本语法结构,所以相信大家没有太大的难度。
接下来,我们考虑如何用递归实现二分查找。递归函数需要满足两个条件: ,要有一个基准情形(base case),即可以直接停止递归的情况;第二,递归式必须趋向于基准情形。
对于二分查找来说,基准情形就是当待查找序列只剩下一个元素时,还没有找到目标位置,那么直接返回-1。而在递归式中,我们每次都将待查找序列平分成两半,并在其中一半中递归查找,直到找到目标位置或者查找序列范围为0。
下面是递归版本的二分查找代码:
def binary_search_rec(arr, target, left, right):
if left > right:
return -1
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
return binary_search_rec(arr, target, mid+1, right)
else:
return binary_search_rec(arr, target, left, mid-1)
这段代码与上一段代码有些许不同,因为我们使用left和right指针作为参数传递给递归函数,这样可以使得每次递归只查找一半的范围。在递归函数中,我们首先判断左右端点是否重合,如果重合了,说明查找范围为0,直接返回-1。接下来,我们计算中间位置的下标mid,如果中间位置的元素值等于目标值,直接返回mid。如果中间位置元素值小于目标值,那么继续在右半边查找,更新left指针;如果中间位置元素值大于目标值,那么继续在左半边查找,更新right指针。然后,我们使用递归方式在新的查找范围内继续查找,直到找到目标位置或者范围为0。
至此,我们已经介绍了在Python中实现二分查找的两种方法:非递归方法和递归方法。可以通过不断练习和实践来加深对二分查找算法的理解和掌握。
