查找-二分查找-算法分析和python代码实现

算法分析:

"""
    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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值