一、算法原理
二分查找算法又称折半查找算法,每次将待查找的序列一分为二(经实验,一分为二总是比一分为四、一分为八等等快),首先用待查找的目标值target与中间值middle比较,如果待查找值在左侧则直接舍弃右侧,若待查找值在右侧则直接舍弃左侧,若相等则查找结束。
举例说明:比如在待查找序列[18, 19, 22, 24, 56, 60, 66, 77, 88]中查找目标值66。
简单来说,右侧半截为60 66 77 88,而目标值是66,所以直接丢掉左侧序列18 19 22 24,因为56是中间值已经比较过,所以被丢弃。如此反复上面的过程,直到找到66这个值所在位置。
二、实现过程
# 自定义二分查找函数
def search(data, target):# 待查找序列的左侧边left = 0# 待查找序列的右侧边right = 8# 循环判断左侧小于等于右侧且键值不等于-1 。输入-1代表结束程序。while left <= right and target != -1:# 二分向下取整mid = (left + right) // 2# 如果目标值等于边界值if target == data[mid]:# 返回边界位置return mid# 如果目标值小于边界值elif target < data[mid]:# 输出在左半边查找print("%d介于位置%d[%d]和边界值%d[%d]之间,找左半边"% (target, left + 1, data[left], mid + 1, data[mid]))# 最高位等于边界位置减1right = mid - 1# 如果目标值大于边界值elif target > data[mid]:# 输出在右半边查找print("%d介于边界值位置%d[%d]和%d[%d]之间,找右半边"% (target, mid + 1, data[mid], right + 1, data[right]))# 最低位等于边界位置加1left = mid + 1# 自定义函数到此结束return -1# 即将查找的目标值
target = 66
# 待查找的数列
data = [18, 19, 22, 24, 56, 60, 66, 77, 88]i = search(data, target)
print(i)