查找算法
顺序查找(线性查找)
- 思想:根据列表下标的顺序,一步步查找列表中的元素是否有与需查找元素相对应,有则返回下标。
- 代码实现
# 顺序查找
def linear_search(li,e):
for ind,val in enumerate(li):
if val == e:
return ind
else:
return None
li = list(range(10))
import random
random.shuffle(li)
print(li)
print(linear_search(li,8))
- 时间复杂度:O(n)(对列表元素进行一次遍历)
二分查找
- 思想:前提为有序列表,对列表进行平均分割,当待找元素大于分割界为下标的元素时,往分割线的后半部分进行查找,否则往分割线前半部分查找
- 代码实现
# 折半查找
def binary_search(li,value):
left=0 # 设置左边下标
right=len(li)-1 # 设置右边下标
while left<=right: # 当剩余元素不为0时
mid=(left+right)//2 # 设置中间下标(以中间下标的值作为分裂口)
if li[mid]>value:
right=mid-1
elif li[mid]<value:
left=mid+1
else:
return mid
else:
return None
li = list(range(50))
print(li)
print(binary_search(li,20))
- 例题
# 题目:给定一个m*n的二维列表,查找一个数是否存在
li=[[1,3,5,7],[10,11,16,20],[23,30,34,50]] # 已知该列表是有序列表,可用二分查找
ltmp=[]
for i in li:
ltmp.extend(i)
print(ltmp)
def binary_sort(li,value):
left = 0
right = len(li)-1
while left<=right: # 当元素个数不为0时
mid = (left+right)//2
if li[mid]==value:
return mid
elif li[mid]>value:
right = mid-1
else:
left = mid+1
else:
return False
print(binary_sort(ltmp,9))
- 时间复杂度:O(nlogn)(存在折半查找)