⼆分查找⼜称折半查找,优点是⽐较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插⼊删除困难。
假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字⽐较,如果两者相等,则查找成功;否则利⽤中间位置记录将表分成前、后两个⼦表,如果中间位置记录的关键字⼤于查找关键字,则进⼀步查找前⼀⼦表,否则进⼀步查找后⼀⼦表。重复以上过程,直到找到满⾜条件的记录,使查找成功,或直到⼦表不存在为⽌,此时查找不成功。
递归实现
def binary_search(li,item):
"""二分查找 递归版"""
n = len(li)
# 当列表为空时,就返回没找到
if n == 0:
return False
# 进行二分
mid = n // 2
if item == li[mid]: # 找到元素
return True
elif item < li[mid]: # 在前半部分
# 递归查找
return binary_search(li[:mid],item)
else: # 在后半部分
# 递归查找
return binary_search(li[mid+1:],item)
if __name__ == '__main__':
li = [1,12,14,17,22,24,25,28,33,35,42]
print(binary_search(li,21))
print(binary_search(li,14))
非递归实现
def binary_search(li,item):
"""二分查找 非递归"""
start = 0
end = len(li)
while start <= end:
# 进行二分
mid = (start + end) // 2
# 找到
if item == li[mid]:
return True
# 在前半部分
elif item < li[mid]:
end = mid - 1 # 让end定位到mid的前一个位置,形成新列表
else: # 在后半部分
# 让开始位置在后半部分,及mid的后一个位置
start = mid + 1
# 循环结束,不能再分时,还没找到,就返回False
return False
if __name__ == '__main__':
li = [1,12,14,17,22,24,25,28,33,35,42]
print(binary_search(li,21))
print(binary_search(li,14))