算法分析:
""" 1、二分查找合适在有序的队列中查找特定的值 2、根据查找的功能不同,由于可能存在多个find-value相等的值,则需要规划不同的查找方式 [1,2,3,4,5,5,5,5,6,7,8,9] 如果 find-value设置为5则 1)查找find-value 第一个出现的位置;规划find-value在右区间的第一个位置,return right 即左指针移动范围[1,2,3,4] ,右指针移动范围[5,5,5,5,6,7,8,9] 2)查找find-value 最后一个出现的位置,规划find-value在左区间的最后一个位置,return left 即左指针移动范围[1,2,3,4,5,5,5,5] ,右指针移动范围[6,7,8,9] 3)查找比find-value 大的第一个位置,规划find-value在左区间的最后的位置,return right 即左指针移动范围[1,2,3,4,5,5,5,5] ,右指针移动范围[6,7,8,9] 4)查找比find-value 小的第一个位置,规划find-value在右区间最开始的位置,return left 即左指针移动范围[1,2,3,4] ,右指针移动范围[5,5,5,5,6,7,8,9] """
代码实现:
"""
1、二分查找合适在有序的队列中查找特定的值
2、根据查找的功能不同,由于可能存在多个find-value相等的值,则需要规划不同的查找方式
[1,2,3,4,5,5,5,5,6,7,8,9] 如果 find-value设置为5则
1)查找find-value 第一个出现的位置;规划find-value在右区间的第一个位置,return right
即左指针移动范围[1,2,3,4] ,右指针移动范围[5,5,5,5,6,7,8,9]
2)查找find-value 最后一个出现的位置,规划find-value在左区间的最后一个位置,return left
即左指针移动范围[1,2,3,4,5,5,5,5] ,右指针移动范围[6,7,8,9]
3)查找比find-value 大的第一个位置,规划find-value在左区间的最后的位置,return right
即左指针移动范围[1,2,3,4,5,5,5,5] ,右指针移动范围[6,7,8,9]
4)查找比find-value 小的第一个位置,规划find-value在右区间最开始的位置,return left
即左指针移动范围[1,2,3,4] ,右指针移动范围[5,5,5,5,6,7,8,9]
"""
list_int = [1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 8, 9]
find_num = 5
def binary_search(list_int, find_num):
"""
查找比find-value 大的第一个位置
分析:属于情况3,按照情况三规划指针移动区间
:param list_int:
:param find_num:
:return:
"""
left = 0 # 2分法左区间
right = len(list_int) # 2分法右区间
while left + 1 < right: # 左指针接近右指针的时候停止
mid = (left + right) // 2 # 计算2分位置
if list_int[mid] <= find_num: # 2分位置值比查找值小,移动左指针到2分位置,由于规划find_num在左区间最右边,所以左边可以等于find_num
left = mid
else: # 2分位置值比查找值大,右边左指针到2分位置
right = mid
return list_int[right]
result = binary_search(list_int, find_num)
print(result)