一、二分查找
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
# -*- encoding: utf-8 -*-
"""
@File : _search.py
@Time : 2019/11/22 10:48
@Author : chen
"""
# 二分查找
#(非递归实现)
def binary_search(li, item):
first = 0
last = len(li) -1
while first <= last: # 当first和last相同时候,循环查找完整个列表了
mid = (first + last) // 2 # 需要放在循环内,不断修改查找区间
if li[mid] == item:
return True
elif item < li[mid]:
last = mid - 1 # 搜索范围改变
else:
first = mid + 1 # 搜索范围改变
return False # 循环查找完整个列表,没有结果
# (递归实现)
def bin_search(li, item):
if len(li) <= 0: # 当list元素小于1的时候,遍历循环了整个list
return False
else: # 循环查找的过程中
mid = len(li) // 2 # 需要放在循环内,不断修改查找区间
if li[mid] == item:
return True
else:
if item < li[mid]:
return bin_search(li[:mid], item) # 注意这里的li[:mid]范围问题 与列表最前端元素的查找有关
else:
return bin_search(li[mid+1:], item) # 注意这里的li[mid+1:]范围问题 与列表尾端元素查找有关
if __name__ == '__main__':
li = [3, 4, 13, 21, 32, 46, 55, 57, 77]
print(binary_search(li, 3))
print(binary_search(li, 5))
print(binary_search(li, 77))
print(bin_search(li, 3))
print(bin_search(li, 5))
print(bin_search(li, 77))