二分排序要求序列(序列可是数组,可是Python里的列表)中元素有序排列,代码定义一个函数,接受一个有序数组和一个元素,如果指定的元素包含在数组中,就返回该元素的位置。
一、过程:
1. 比如0-99,要找出的数是20,二分法的猜测思路,不是一个个依次猜,而是每次都猜测中间元素;
2. 第一次,首位是0,末尾是99,则猜49,49>20,向下取整,则把high指向49减1,即48;
3. 循环,第二次猜(0+48)的一半,自动向下取整数部分,即24,24>20,则把high指向24减1,即23
4. 循环,第三次猜(0+23)的一半,取整数部分,即11,11<20,则把low指向11加1,即12;
5. 循环,第四次猜(12+23)的一半,取整数部分,即17,17<20,则把low指向17加1,即18;
6. 循环,第三次猜(18+23)的一半,取整数部分,即20,20==20,找到了;
二、代码:
def binary_search(list, item):
low = 0 # 设置首位为列表下标为0的位置
high = len(list) - 1 # 设置末位为列表长度减1
while low <= high: # 当首位和末位不重合,只要范围没缩小到只包含一个元素
mid = int((low + high) / 2) # 只要范围是大于1个元素,就一直猜测范围中间的元素为待求元素
guess = list[mid]
if guess == item:
return mid
elif guess < item:
low = mid + 1
else:
high = mid - 1
return None
my_list = [1, 3, 5, 7, 9]
print(binary_search(my_list, 3))
print(binary_search(my_list, 5))
三、输出:
1
2