Python:二分查找

针对有序的不重复数字的列表可以使用二分查找法

l =[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

print(l.index(66))  #查询到66的索引

index = 0       #for循环的方式查找66的索引
for i in l:
    if i == 66:
        print(index)
    index += 1

for i in range(len(l)): #for循环方法二
    if l[i] == 66:
        print(i)
利用递归函数,通过二分查找方法去寻找目标值的索引
list1=[1,2,4,5,11,67,7878,12228,158121]

def get(num,list):
    if len(list) > 0:           #判定列表长度是否为空,不为空继续
        mid=len(list)//2        #将列表的长度切半,并取出长度
        if num > list[mid]:     #对比列表中间值,如果目标大于中间值,取值范围应该在列表二分后的左半部分
            list=list[mid+1:]   #为列表重新赋值为原列表的左半部分
        elif num < list[mid]:   #对比列表中间值,如果目标大于中间值,取值范围应该在列表二分后的右半部分
            list=list[:mid]     #为列表重新赋值为原列表的右半部分
        else:                   #对比列表的中间值,切好等于目标
            print("find it")    #大于find it,并且执行 return 结束函数
            return
        get(num,list)           #函数走到这里,如果没有return说明,目标没有找到,接下来调用自己后,变成了递归函数.继续执行函数
    else:
        print("not find")       #如果列表长度为空,说明目标不在列表中,打印("not find),结束函数
        return
get(5,list1)
l1 = [2,3,5,10,15,16]

def two_search(l,aim,start=0,end=None):
    end = len(l) - 1 if end is None else end   #若end参数为默认值那么重新给end赋值为len(l)-1,否则end=end参数的值
    if end >= start:                           #判断end是否大于start,如果小于说明没有该值
        mid_index = (end - start) // 2 + start 
        if aim > l[mid_index]:
            return two_search(l,aim,start=mid_index+1,end=end)
        elif aim < l[mid_index]:
            return two_search(l,aim,start=start,end=mid_index-1)
        elif aim == l[mid_index]:
            return mid_index
        else:
            return '没有此值'
    else:
        return '没有此值'
print(two_search(l1,5))

猜你喜欢

转载自www.cnblogs.com/bailo/p/9162354.html