问询:实现带4参数的有序子序列递归二分查找算法
实现递归二分查找(返回存在位置或插入位置)
没问题!我来帮你搞定这个递归二分查找算法,完全符合你说的参数要求和返回逻辑。咱们先理清楚核心思路,再上代码:
核心逻辑梳理
递归二分查找的关键是不断缩小搜索范围,直到触发基线条件:
- 当
first > last时,说明目标值不在当前子序列里,这时候first就是它应该插入的位置(因为所有左边的元素都比target小,右边的都比它大)。 - 每次计算中间索引
mid,对比target和list[mid]:- 相等就直接返回
mid,找到位置了; - target更小就去左半子序列继续找(调整
last = mid - 1); - target更大就去右半子序列找(调整
first = mid + 1)。
- 相等就直接返回
代码实现(Python)
def recursive_binary_search(arr, first, last, target): # 基线条件:没找到目标,返回插入位置 if first > last: return first # 计算中间索引,避免溢出可以用 first + (last - first) // 2 mid = (first + last) // 2 if arr[mid] == target: return mid elif arr[mid] > target: # 目标在左半部分,递归搜索左子序列 return recursive_binary_search(arr, first, mid - 1, target) else: # 目标在右半部分,递归搜索右子序列 return recursive_binary_search(arr, mid + 1, last, target)
测试案例验证
咱们来试几个例子看看效果:
# 测试存在目标值的情况 sorted_arr = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91] print(recursive_binary_search(sorted_arr, 0, len(sorted_arr)-1, 23)) # 输出:5(正确位置) # 测试不存在目标值的情况,返回插入位置 print(recursive_binary_search(sorted_arr, 0, len(sorted_arr)-1, 10)) # 输出:3(应该插在8和12之间) print(recursive_binary_search(sorted_arr, 0, len(sorted_arr)-1, 100)) # 输出:10(插在末尾) print(recursive_binary_search(sorted_arr, 0, len(sorted_arr)-1, 1)) # 输出:0(插在开头)
关键点说明
- 为什么基线条件返回
first?当first > last时,说明所有比target小的元素都在first左边,比它大的在右边,所以插入first的位置刚好能保持序列有序。 - 计算
mid的时候,如果担心first + last溢出(比如处理极大的列表),可以换成first + (last - first) // 2,结果是一样的,更安全。 - 注意输入的列表必须是有序的,二分查找的前提就是有序序列,不然结果会出错哦!
内容的提问来源于stack exchange,提问作者Owen Brain
相关产品推荐
相关产品推荐

