二分查找python代码递归
二分查找是一种高效的检索算法,常用于有序数组中查询某一元素的位置。而Python作为一种高级编程语言,也提供了多种实现二分查找的方法,其中递归法是一种常用的方式。
一、二分查找的基本思想
二分查找(Binary Search)原理是将有序数组分成左右两个子数组,每次都取中间位置的数进行比较,如果该数小于要查找的值,就选择右边的子数组继续进行查找,如果该数大于要查找的值,就选择左边的子数组继续进行查找,直到找到为止。
二、二分查找算法的时间复杂度分析
对于一个有 N 个元素的有序数组,每次查找过程都可以将其长度缩短一半,因此最坏情况下的查找次数为 log2N,即可得出时间复杂度为 O(logN)。
三、二分查找python代码实现
1、非递归法
def binary_search(arr, x):
low = 0
high = len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] < x:
low = mid + 1
elif arr[mid] > x:
high = mid - 1
else:
return mid
return -1
2、递归法
def binary_search(arr, low, high, x):
if low <= high:
mid = (low + high) // 2
if arr[mid] == x:
return mid
elif arr[mid] > x:
return binary_search(arr, low, mid - 1, x)
else:
return binary_search(arr, mid + 1, high, x)
else:
return -1
四、递归法实现细节分析
上述递归法实现中,需要注意以下几个细节:
1、递归函数的定义:首先需要定义一个递归的函数,输入的参数为数组,查找区间的下标范围low和high,以及要查找的值x。函数返回值为该值在数组中的下标,如果找不到则返回-1。
2、递归结束的条件:当查找区间的下标范围low>high时,说明该值不在数组中,返回-1。
3、获取查找中间位置的下标:对于一个查找区间,需要不断地确定其中间位置的下标mid,该下标可由mid = (low + high) // 2 得到。
4、判断当前位置处的值与目标值的关系:如果该位置处的值大于目标值,则说明目标值位于查找区间的左侧,调用函数时查找左半部分的数组;如果该位置处的值小于目标值,则说明目标值位于查找区间的右侧,调用函数时查找右半部分的数组。
五、二分查找python代码递归的优缺点
1、优点
(1)代码简单易懂:递归的代码相对于非递归的代码更加简单明了。
(2)代码风格一致:递归代码风格与其他的递归代码风格相同,适合组织成递归框架。
2、缺点
(1)空间复杂度较高:递归法在每一层递归时都需要存储变量的值,因此它需要大量的栈空间,如果递归层数过多会导致栈溢出的问题。
(2)效率相对于非递归方法较低:递归方法由于涉及到函数的调用和返回,相对于非递归方法,会有一定的时间和空间开销。