1. 顺序查找
顺序查找就是从列表的第一项开始,依次进行搜索,一直到列表最后或者找到元素为之。
例:从列表中按照顺序查找一个数字,存在返回下标,否则返回None
# 在一个列表中查找一个数,
# 如果存在返回该数字的下标,否则返回None
def f(data_list, value):
for i in data_list:
if value == i:
return data_list.index(i)
break
else:
return None
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(f(data, 6)) # 输出5
print(f(data, 15)) # 输出None
2. 二分查找
注意:列表必须有序
思路:
- 先给定一个范围 比如:1-100
- 先找这个范围的一半mid,也就是数字50(下标为49)
- 如果找大了,则将最大范围设为 mid-1,此时范围为数字1-49(下标范围:0-48)
- 如果找小了,则将最小范围设为 mid+1,此时范围为数字50-100(下标范围:51-100)
- 重复2-4步骤,直到找到这个数字
例如:在1到100之间找1,会先找中间下标49,如果找大了 就往mid右边找,如果找的小了 就往mid左边找
data_list = [i for i in range(1, 101)] # 带查找的列表
value = 2 # 要查找的数
left = 0 # 最左边下标
right = len(data_list) - 1 # 最右侧下标
x = 1
while left <= right: # 左边下标小于右边下标,在列表这个范围找
mid = (left + right) // 2 # 整除,取中间下标位置
print('\n第{}次,取中间的下标为:{}'.format(x, mid))
if data_list[mid] == value: # 如果要查找的数字等于中间位置的数字时,则打印该索引
print('这个数的下标为:', mid)
break
elif data_list[mid] > value:
right = mid - 1
else:
left = mid + 1
print('\t\tleft:{}, right:{}'.format(left, right))
x += 1
else:
print(None)
def search(data_list, value):
"""
:param data_list: 待查找的列表
:param value: 要查找的数字
:return:下标或None
"""
left = 0 # 列表最左边下标
right = len(data_list) - 1 # 列表右边下标
while left <= right: # 左边下标小于右边下标,在列表这个范围找
mid = (left + right) // 2 # 整除,取中间下标位置
if data_list[mid] == value: # 如果要查找的数字等于中间位置的数字时,则返回该索引
return mid
elif data_list[mid] > value:# 如果mid大于要查找的数,将right重新赋值为中间下标的左侧(也就是mid-1)
right = mid - 1
else:
left = mid + 1
# print('mid:{}, left:{},right:{}'.format(mid, left, right))
else:
return None
a = [i for i in range(100)]
print(search(a, 2))