查找
python里的内置函数index()
list.index(x, start, end)
x-- 查找的对象。
start-- 可选,查找的起始位置。
end-- 可选,查找的结束位置。
List = ['123', 'abc', 'teacher', 'school']
print("abc索引位置: ", List.index('abc'))
print("123索引位置 : ", List.index( '123', 0, 3 ))
print("123索引位置 : ", List.index( '123', 2, 3 ))
从结果可以看出,当将123的搜索位置变化后,会显示无法搜索成功
事实上index()函数就是顺序查找,后续会提到
顺序查找
顾名思义,就是从第一个元素进行查找,找到返回下标,找不到则返回空值
时间复杂度:O(n)
def linear_search(li,val):
for index,v in enumerate(li):
if v == val:
return index
else:
return None
但这种方法如果列表中有相同值,只会返回第一个值的下标,因此做了一下改进:
def linear_search2(li,val):
shunxu =[]
for index, v in enumerate(li):
if v == val:
shunxu.append(index)
print(shunxu)
list = [2,5,6,8,2,5]
linear_search2(list,5)
有一个列表来存储下标,防止出现多个
二分查找
二分查找仅适用于有序列表,因此查找前需要利用sorted()函数进行排序
sorted()排序函数
sorted(li,reverse值)
reverse默认为False ,降序排序时reverse=True
注意sorted() 不会改变原列表,因此需要一个新列表来存储排序后的列表
li1 = [2,6,4,8,5]
li2 = sorted(li1)
print(li1,li2)
二分查找
二分查找又称折半查找,即在一个有序列表中,每次减少一半。有mid right left三个下标,每次mid为left和right的向下取整
若li[mid] > 待查找值,则将搜索区域缩小至左半边,即right = mid - 1
若li[mid] < 待查找值,则将搜索区域缩小至右半边,即right = left = mid + 1
def binary_search(li,val):
left = 0
right = len(li) - 1
while left <= right:
mid = (left + right) // 2 #整除
if li[mid] == val:
return mid
elif li[mid] > val:
right = mid - 1
else:
left = mid + 1
else:
return None
li = [2,1,3,4,5,6,7,8]
li = sorted(li,-1)
print(binary_search(li,5))