用Python写一个冒泡排序法

用Python写冒泡排序法,首先要知道冒泡排序的原理,在一个列表中顺次拿出两个数据比较大小,将大的往后排将小的往前排,如果一共有n个数据一共需要比较n-1次.
最笨的方法:

list_b=[1,5,9,7,6,3,6,4,4,8,85,69,78,99] #例如有一串数据存放在列表
def bubble(list1):    #首先定义一个冒泡排序功能的函数
    for i in range(len(list1)):  #遍历列表
        for j in range(len(list1)-1):
            if list1[j+1]<list1[j]:  #开始比较
                list1[j],list1[j+1]=list1[j+1],list1[j]   # 数值交换
    print(list1)  #打印结果
bubble(list_b)   #调用函数

# 结果[1, 3, 4, 4, 5, 6, 6, 7, 8, 9, 69, 78, 85, 99]

其实上个代码多了许多次无用的比较,分析上面代码,其实质是:
第一次比较出最大的数值放在了最后位,
第二次比较出了次大值,放在了倒数第二位,
第三次比较出第三大的数值放在倒数第三位…
既然如此,已经确定数值与位置的数就不需要再去比较了
即第一次比较得出最后一位的数值,比较了n-1次
第二次比较得出次大值放在倒数第二位不必再与最大值进行比较
第三处比较得出第三大值不必与最大值和次大值比较进行比较
所以找出规律,每次比较的次数位n-i-1,为什么不是n-i,因为遍历是从0开始的滴.

优化后的代码:

list_b=[1,5,9,7,6,3,6,4,4,8,85,69,78,99]
def bubble(list1):
    for i in range(len(list1)):
        for j in range(len(list1)-1-i):   #  其他的都不变 只是这里变成了-1-i
            if list1[j+1]<list1[j]:
                list1[j],list1[j+1]=list1[j+1],list1[j]
    print(list1)
bubble(list_b)
#结果还是一样的 

还可以立个flag设定一个变量为False,如果元素之间交换了位置,将变量重新赋值为True,最后再判断,在一次循环结束后,变量如果还是为False,则break退出循环.

list_b=[1,5,9,7,6,3,6,4,4,8,85,69,78,99]
def bubble(list1):
    for i in range(len(list1) - 1):
        flag = False
        for j in range(len(list1) - 1 - i):
            if list_b[j] > list1[j + 1]:
                list1[j], list1[j + 1] = list1[j + 1], list1[j]
                flag = True
        if not flag:
            break
    return list1
print(bubble(list_b))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值