码迷,mamicode.com
首页 > 其他好文 > 详细

?分查找

时间:2018-11-23 21:31:56      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:search   bre   count   arch   有序   序列   def   while   arc   

 ?分查找.

每次能够排除掉?半的数据. 查找的效率非常?. 但是局限性比较?. 必须是有 序序列才可以使??分查找 要求: 查找的序列必须是有序序列.

# 判断n是否在lst中出现. 如果出现请返回n所在的位置
# ?分查找---?递归算法
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
n = 567
left = 0
right = len(lst) - 1
count = 1
while left <= right:
    middle = (left + right) // 2
    if n < lst[middle]:
        right = middle - 1
    elif n > lst[middle]:
        left = middle + 1
    else:
        print(count)
        print(middle)
        break
    count = count + 1
else:
    print("不存在")

普通递归版本?分法

def binary_search(n, left, right):
    if left <= right:
        middle = (left+right) // 2
        if n < lst[middle]:    
            right = middle - 1
        elif n > lst[middle]:
            left = middle + 1
        else:
            return middle
        return binary_search(n, left, right) # 这个return必须要加. 否则接收
到的永远是None.
    else:
        return -1
print(binary_search(567, 0, len(lst)-1))                                             

另类?分法, 很难计算位置

def binary_search(ls, target):
    left = 0
    right = len(ls) - 1
    if left > right:
        print("不在这?")
    middle = (left + right) // 2
    if target < ls[middle]:
        return binary_search(ls[:middle], target)
    elif target > ls[middle]:
        return binary_search(ls[middle+1:], target)
    else:
        print("在这?")
binary_search(lst, 567)    

 

?分查找

标签:search   bre   count   arch   有序   序列   def   while   arc   

原文地址:https://www.cnblogs.com/y0413/p/10009772.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!