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