二分查找
概念
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
代码实现过程
# lists 要查找的列表
# key 要查找的数字
def binarySearch(lists,key):
start = 0 # 起始坐标
end = len(lists)-1 # 结束坐标
while start <= end: # 程序的出口条件
mid = start + (end-start)//2 # 中间坐标
if lists[mid] == key:
return mid
elif lists[mid] > key:
end = mid - 1
else:
start = mid + 1
return -1 # 查找不到数据 就返回-1
lists:[1,2,3,5,7,9]
key:7
return the index:4
lists:[1,2,3,5,7,9]
key:4
return the index:-1
推理过程
在有序列表中,先确定中间值,把列表分为前后两个列表,如果中间值大于要查找的值,则在前列表查找,否则在后列表查找。重复该过程,如果找到该数值,返回下标,找不到则返回-1.
lists = [1,2,3,5,7,9] key= 4
[1,2] [3,] [5,7,9]---------3与4进行比较
[5] [7] [9]---------7与4进行比较
[5]---------5与4进行比较
返回-1
时间复杂度
该折半算法的时间复杂度为 O(logN)
算法的变化
如果要查找的列表中含有重复字符,如何返回第一个匹配的字符下标。如find,index函数。
def binarySearch(lists,key):
start = 0 # 起始坐标
end = len(lists)-1 # 结束坐标
while start < end: # 程序的出口条件 去了=号 加了=无法退出
mid = start + (end-start)//2 # 中间坐标
if lists[mid] >= key: # 改为 >=
end = mid
else:
start = mid + 1
return start # 返回的是值,不再是-1 返回end也行
推理过程
lists = [3,3,3,3,3,5,7] key = 3
[3,3,3] [3] [3,5,7]------------3与3比较
[3,3,3,3]
[3,3] [3] [3]------------3与3比较
[3,3,3]
[3][3][3]--------3与3比较
[3][3]--------比较完后 达到退出程序条件 返回下标
返回0