zoukankan      html  css  js  c++  java
  • 二分查找

    二分查找必须保证是"有序的"一个列表或元组,因为列表和元祖都是有下标的.
    思想: 掐头结尾取中间,每一次都和中间的那个数进行比较,如果比中间的数大,往左移,比中间的数小,往右移.

    递归二分查找

    # lst = [1,2,2,3,4,5,6,7,8,14,21,23,25,41,58,66,225,574]
    #
    # left = 0    # 最左边的索引位置
    # right = len(lst) - 1    # 最右边的索引位置
    #
    # def lookup(left,right,n):   # 传入最左索引,最右,还有要找的值
    # 	middle = (left + right) // 2    # 找到中间的位置,前面加后面除2,就是中间,索引都是是整数,所以用地板除
    # 	print(f'中间位置{middle}')  # 打印每一次使用的中间位置
    # 	if right < left:    # 如果最右边小于最右边,就证明,两端已经相遇了,不能再接着找了,再找索引就会超出范围
    # 		print('没找到')
    # 		return -1   # 返回"-1"表示没事找到
    # 	elif n > lst[middle]:   # 如果要找的数大于中间的数,证明要找的数在中间的右边
    # 		left = middle + 1
    # 		lookup(left, right, n)
    # 	elif n < lst[middle]:   # 如果要找的数小于中间的数,证明要找的数在中间的左边
    # 		right = middle - 1
    # 		lookup(left, right, n)
    # 	else:
    # 		print(f'索引为{middle}')
    #
    # lookup(left,right,574)
    

      

    纯算法二分查找

    lst = [1,2,3,4,5,6,7,8,14,21,23,25,41,58,66,225,574]
    left = 0    # 头
    right = len(lst) - 1    # 尾
    n = 66
    while left <= right:
    	middle = (left + right) // 2
    	if n > lst[middle]:
    		left = middle + 1
    		print(left)
    	elif n < lst[middle]:
    		right = middle - 1
    		print(right)
    	else:
    		print(f'找到了{middle}')
    		break
    else:
    	print("没找到")
    

      

  • 相关阅读:
    [bzoj1251]序列终结者
    Codeforces #Round 406(Div.2)
    [3.23校内训练赛]
    [APIO2009]
    [APIO2016]
    [bzoj1901]动态区间k大
    [9018/1904]火星商店
    [bzoj3673/3674可持久化并查集加强版]
    [bzoj1297][SCOI2009]迷路
    [bzoj1218][HNOI2003]激光炸弹
  • 原文地址:https://www.cnblogs.com/594504110python/p/9352839.html
Copyright © 2011-2022 走看看