用python编写二分查找算法
程序员文章站
2022-05-13 19:56:05
...
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点:是要求待查表为有序表,且插入删除困难。使用场景:不经常变动而查找频繁的有序列表。
思想:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,
如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找(递归版)
def binary_search(alist, item):
"""二分查找(递归版)"""
n = len(alist) # 获取列表长度
if len(alist) == 0: # 传入了一个空的列表,代表元素并未找到
return False
mid = n // 2
if item == alist[mid]:
return True # 元素找到
elif item < alist[mid]:
# 元素在左半部分,递归调用
return binary_search(alist[:mid], item)
else:
# 元素在右半部分,递归调用
return binary_search(alist[mid + 1:], item)
if __name__ == '__main__':
alist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]
print(binary_search(alist, 3)) # False 未找到
print(binary_search(alist, 13)) # True 找到
二分查找 (非递归版)
def binary_search(alist, item):
"""二分查找 (非递归版)"""
start = 0
end = len(alist) - 1
while start <= end:
# 计算中间mid游标的值
mid = (start + end)//2
if item == alist[mid]:
# 元素找到
return True
elif item < alist[mid]:
# 元素在左半部分,递归调用
end = mid -1
else:
# 元素在右半部分,递归调用
start = mid + 1
# 跳出循环,start>end表示元素不存在
return False
if __name__ == '__main__':
alist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]
print(binary_search(alist, 3)) # False 未找到
print(binary_search(alist, 13)) # True 找到