顺序查找和二分法

顺序查找

顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表的最后一个元素为止,简单理解就是从头走到尾

def  liner_search(lst,val):
    for i,v in enumerate(lst):
        if  v == val:
            return i
    else:
        return None

 二分查找

二分查找:又叫折半查找,从有序列表的初始候选区开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半.

 

 mid = (left + right)//2, 然后用mid 和 查找的元素进行比较,如果mid比查找的元素大,说明要查找的元素在左半区,此时右半区不用管了,让right移动到4这个位置(mid - 1),然后在计算新的mid = (left + right)/2,

 

 此时发现mid比查找的元素小,此时要移动我的left(mid + 1) , 5//2=2,整除没有余数,此时mid == 查找的数,输出它,

 

当left>right表示候选区没有值了,只有left<right时,候选有值,left=right时候选区有一个值

 

 

 

代码示例

import time

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]  # 如果无序列表最好先排序(升序)


def binary_search(lst, val):
    left = 0
    right = len(lst) - 1
    while left <= right:  # 说明候选区有值
        mid = (left + right) // 2  # mid值会根据left和right值变化而变化
        if lst[mid] == val:
            return mid  # 返回下标
        elif lst[mid] > val:  # 代表目标值在mid的左边
            right = mid - 1

        elif lst[mid] < val:  # 代表目标值在mid的右边
            left = mid + 1
    else:  # 如果找不到
        return None


start = time.time()
ret = binary_search(lst, 11)
print(time.time() - start)
print(ret)
二分法

 

posted @ 2022-10-30 22:39  断浪狂刀忆年少  阅读(96)  评论(0)    收藏  举报