二分法搜索(binary_search)——Python实现
# 二分搜索
# 输入:按从小到大顺序排列的数组A,要搜索的数num
# 输出:如果搜索到,则输出该元素的位置,如果没有搜索到,则输出“没有搜索到该值”;并且输出比较次数count_compare
1import math 2 3def binary_search(A,num): 4 5print('\n 输入的数组为:',A) 6print(' 要搜索的数为:',num) 7 8 n = len(A) # n 数组长度 9 low = 0 # low 指向低地址的指针10 high = n-1 # high 指向高地址的指针11 num_location = -1 # num_location 要搜索的元素的位置12 count_compare = 0 131415while high - low > 1 and num_location == -1: 1617 mid = ( (low + high)/2 ) # mid 指向low和high中心元素的指针,floor表示向下取整1819if A[mid] == num: 20 num_location = mid # 当且仅当找到要搜索的值,才会改变num_location的值 21elif A[mid] <= num: 22 low = mid 23else: 24 high = mid 2526 count_compare = count_compare + 1 2728# print('第i趟搜索:',count_compare) 29# print('mid ',mid);print('low ',low);print('high ',high) 303132if high - low == 1: # 如果指针指向相邻的两个元素,那么要搜索的值要么是这两个元素其一,要么不存在33if A[low] == num: 34 num_location = low 35elif A[high] == num: 36 num_location = high 37 count_compare = count_compare + 1 38# 注:极少数情况下,若最后两个数相等,且都为要搜索的数,则通过此if判断语句后,num_location会变为high,也就是只会输出后面的元素的位置394041if num_location == -1: # 说明没有搜索到要搜索的值42print('\n 没有搜索到该值') 43print(' 比较次数为:', count_compare) 44else: 45print('\n 在该数组的位置:', num_location+1) 46print(' 比较次数为:', count_compare)
函数调用
1 A = [-39, -22, -1, 5, 12, 21, 33, 56, 56, 76, 92, 92, 110, 999] 2 num = 110 3 binary_search(A,num)
运行结果
输入的数组为: [-39, -22, -1, 5, 12, 21, 33, 56, 56, 76, 92, 92, 110, 999] 要搜索的数为: 110 在该数组的位置: 13 比较次数为: 4
THE END