二分查找法
我们在使用一个列表的时候,往往需要找到一个元素的位置也就是它的索引,按照一般的情况,肯定是一个一个的找过去,元素多了就是一件麻烦事。。
后来就引进了一个概念:二分查找法
它是根据情况将数据分为两半,找出中间值,然后让要查找的值和它比较,逐渐缩小范围直到找到相应的值。。。
我目前能想到的是可以运用到数字上面,因为数字可以比较大小,当然这些数字必须是有序排列的
例如:找出下面列表中的某个元素
我们一般的查找方法 l1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] def found(list,target): x=1 for i in list: if i==target: print('找到了') break else: x=x+1 print(x) found(l1,5) # 结果为 找到了,x为5 found(l1,1) #结果为 找到了,x为1 有个奇怪的现象,我们查找一个不存在的元素时,它的值是列表里面的元素个数加1 found(l1,19) found(l1,100) 结果都为 19
那么二分查找法如何实现:

l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] n=1 def half_search(list, target, start=0, end=None): global n end = len(list) - 1 if end is None else end if end >= start: mid_index = (end - start) // 2 + start # 找出中间索引的位置 if target > list[mid_index]: n= n + 1 return half_search(list, target, start=mid_index + 1, end=end) elif target < list[mid_index]: n = n + 1 return half_search(list, target, start=start, end=mid_index - 1) elif target == list[mid_index]: print('找了%s次' % n) return '它的索引为%s'%mid_index else: print('找了%s次' % n) return '没有找到' else: print('找了%s次' % n) return '没有此值' print(half_search(l1,1)) #结果为 找了4次 它的索引为0 print(half_search(l1,5)) #结果为 找了7次 它的索引为4 print(half_search(l1,10)) #结果为 找了10次 它的索引为9
从上面的比较我们可以看出,如果元素考前的话,一般的查找有有优势,但是二分查找法在大量的数据中是有绝对优势的
二分查找法,查找一个存在的元素最多查找 n/2+1次,n为元素的个数