2.1 二分查找的步骤
- 假设表中元素是按升序排列
- 将表中间位置记录的关键字与查找关键字比较
- 如果两者相等,则查找成功
- 否则利用中间位置记录将表分成前、后两个子表
- 如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
- 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
2.2 二分查找的图解

2.3 二分查找代码
2.3.1 非递归版
def binary_search(alist, item): """二分查找""" # 设置起始位置 获取中间值 start = 0 end = len(alist) - 1 while start <= end: # 获取中间值 mid = (start + end)//2 if item == alist[mid]: return True elif item < alist[mid]: end = mid - 1 elif item > alist[mid]: start = mid + 1 # 没有找到想要找的数字 return Falseif __name__ == '__main__': alist = [1,2,3,4,5] print(binary_search(alist, 1)) print(binary_search(alist, 100))
2.3.2 递归版
def binary_search(alist, item): """二分查找""" # 数列的长度 n = len(alist) # 递归的结束条件 if n == 0: return False # 中间值 mid = n//2 if item == alist[mid]: return True elif item < alist[mid]: return binary_search(alist[0:mid], item) elif item > alist[mid]: return binary_search(alist[mid+1:], item)if __name__ == '__main__': alist = [1,2,3,4,5] print(binary_search(alist, 1)) print(binary_search(alist, 100))
2.4 二分查找的时间复杂度
- 最优时间复杂度:O(1)
- 最坏时间复杂度:O(logn)