day6--二分查找法

二分查找法

我们在使用一个列表的时候,往往需要找到一个元素的位置也就是它的索引,按照一般的情况,肯定是一个一个的找过去,元素多了就是一件麻烦事。。

后来就引进了一个概念:二分查找法

它是根据情况将数据分为两半,找出中间值,然后让要查找的值和它比较,逐渐缩小范围直到找到相应的值。。。

我目前能想到的是可以运用到数字上面,因为数字可以比较大小,当然这些数字必须是有序排列的

例如:找出下面列表中的某个元素

我们一般的查找方法
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
View Code

从上面的比较我们可以看出,如果元素考前的话,一般的查找有有优势,但是二分查找法在大量的数据中是有绝对优势的

二分查找法,查找一个存在的元素最多查找 n/2+1次,n为元素的个数

原文地址:https://www.cnblogs.com/mmyy-blog/p/9222962.html