Python中利用二分法在一万个有序数列中找到目标值并打印其索引

# -*- coding: utf-8 -*-

"""
在一万个有序数列中找到目标值并打印其索引
目前测试的是在一万个有序数列中,每个值的范围在两万以内。当然,数列的长度(这里是一万)以及值的范围(这里的两万)都可以自定义。

重点知识:
二分法
递归函数
"""

import random


def create_data(list_size, range_num):
    """
    随机生成一个列表,指定了列表长度以及每个值所在的范围
    :param list_size: 列表长度
    :param range_num: 每个在列表中的值的大小范围
    :return: 生成的列表
    """
    temp_set = set()
    while len(temp_set) < list_size:
        i = random.randrange(range_num)
        if i not in temp_set:
            temp_set.add(i)
    data_set = list(temp_set)
    data_set.sort()
    return data_set


def search_goal(data, find_num):
    """
    在列表中查找目标值
    :param data: 传入的列表
    :param find_num: 查找的目标值
    :return: 返回布尔值,在列表中是否查找到了
    """
    if len(data) > 1:
        mid_index = int(len(data) / 2)
        if data[mid_index] == find_num:
            # print("目标数字[{0}]已找到!".format(find_num))
            return True
        elif data[mid_index] > find_num:
            return search_goal(data[:mid_index], find_num)
        else:
            return search_goal(data[mid_index:], find_num)
    else:
        if data[0] == find_num:
            # print("目标数字[{0}]已找到!".format(find_num))
            return True
        else:
            print("\033[1;31m 目标数字[{0}]在列表中不存在!\033[0m".format(find_num))


if __name__ == '__main__':
    while True:
        goal_num = input("在一万个有序数列(该序列数字范围在两万以内)中查找数字;请输入需要查找的数字:")
        if goal_num.isdigit():
            goal_num = int(goal_num)

            data_created = create_data(10000, 20000)
            res = search_goal(data_created, goal_num)
            if res:
                print("\033[1;32m 目标数字[{0}]已找到,其在列表中的索引为{1}\033[0m".format(goal_num, data_created.index(goal_num)))
        else:
            print("\033[1;31m 目标值输入无效,请重新输入。\033[0m")
posted @ 2018-05-06 04:00  hehongjie  Views(518)  Comments(0Edit  收藏  举报