原理
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
实现
"""
1. 二分查找是有条件的,首先是有序,其次因为二分查找操作的是下标,所以要求是顺序表
2. 最优时间复杂度:O(1)
3. 最坏时间复杂度:O(logn)
"""
# def binary_chop(alist, data):
# """
# 递归解决二分查找
# :param alist:
# :return:
# """
# n = len(alist)
# if n < 1:
# return False
# mid = n // 2
# if alist[mid] > data:
# return binary_chop(alist[0:mid], data)
# elif alist[mid] < data:
# return binary_chop(alist[mid+1:], data)
# else:
# return True
def binary_chop(alist, data):
"""
非递归解决二分查找
:param alist:
:return:
"""
n = len(alist)
first = 0
last = n - 1
while first <= last:
mid = (last + first) // 2
if alist[mid] > data:
last = mid - 1
elif alist[mid] < data:
first = mid + 1
else:
return True
return False
if __name__ == '__main__':
lis = [2,4, 5, 12, 14, 23]
if binary_chop(lis, 14):
print('ok')