比较完整的二分搜索问题

import re


def binary_search(num_list, x):
    # 二分查找
    left, right = 0, len(num_list)
    while True:
        while left < right:
            mid = (left + right) // 2
            if num_list[mid] > x:
                right = mid
            elif num_list[mid] < x:
                left = mid + 1
            else:
                return '待查元素{0}在列表中下标为:{1}'.format(x, mid)
        return '待查找元素%s不存在指定列表中' % x


def is_float(a):
    # 判断是否为浮点数
    value = re.compile(r'^[-+]?[0-9]+\.[0-9]+$')
    result = value.match(a)
    if result:
        return a


def bubble_sort(lists):
    # 利用冒泡排序对用户输入的数组排序
    count = len(lists)
    for i in range(0, count):
        for j in range(i + 1, count):
            if lists[i] > lists[j]:
                lists[i], lists[j] = lists[j], lists[i]
    print("排序后的数组为:", lists)


def receive_list():
    # 接收用户输入,形成数组(列表)
    while True:
        a = input("请输入数组元素,输入“exit”结束:")
        if a.isdigit():
            a = int(a)
            list_one.append(a)
            print("请继续输入数组元素,或者输入“exit”结束输入")
        elif is_float(a):
            a = float(a)
            list_one.append(a)
            print("请继续输入数组元素(输入“exit”结束输入):")
        elif a == "exit":
            break
        else:
            print("您输入的“%a”不是数字,请重新输入" % a)
        print("当前已输入数组为:", list_one)


if __name__ == "__main__":
    list_one = []
    receive_list()
    bubble_sort(list_one)
    while True:
        item = float(input("请输入您要查找的元素(输入“exit”结束查找):"))
        print(binary_search(list_one, item))
        if item == "exit":
            break

 

运行结果:

程序包括用户输入判断,如浮点数,整数,字母,汉字都能进行相应的判断,我写的这个是允许数组中(列表)出现整数和浮点数,为了防止用户输入的不是一个有序数组,在用户输入数组后进行了一次冒泡排序,因为众所周知,二分搜索树是在一个有序的数组中,不断折半、判断的过程,所以进行了一个冒泡排序,

其实算法的思想是一样的,不管用什么语言来写,都是大同小异,无非是某些语言中有一些第三方库和函数。

我的环境是python3.6.4(包:re(用来匹配正则))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一如故往

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值