import random
# 生成随机有序列表
def create_li():
# 二分查找,要求保证数据是有序的
random_li = []
for i in range(20):
num = random.randint(1, 100)
random_li.append(num)
random_li.sort()
return random_li
# 非递归
def search(li, target):
left = 0
right = len(li) - 1
# while循环条件中,这个等号的意义在于:由于计算中间位置是用的是向下取整的方法(如:int(9/2)=4),所以,如果left和right相邻的情况下,将right所指向的值与目标值进行比较
while left <= right:
# 中间值
mid = int((left + right)/2)
# 如果中间值等于目标值
if li[mid] == target:
print("目标数据所在位置索引:", mid)
break
# 如果中间值小于目标值
elif li[mid] < target:
left = mid + 1
# 如果中间值大于目标值
else:
right = mid - 1
else:
print("没有查询到目标数据")
# 递归
def rec_search(left, right, li, target):
if left > right:
return "fail"
# 中间值
mid = int((left + right)/2)
# 如果中间值等于目标值
if li[mid] == target:
return mid
# 如果中间值小于目标值
elif li[mid] < target:
return rec_search(mid+1, right, li, target)
# 如果中间值大于目标值
else:
return rec_search(left, mid-1, li, target)
if __name__ == "__main__":
target = 19
print("目标数据:",target)
random_li = create_li()
print("random_li: ", random_li)
search(random_li, target)
res = rec_search(0, len(random_li)-1,random_li, target)
if res == "fail":
print("没有查询到目标数据")
else:
print("目标数据所在位置索引:", res)