【冒泡排序】(python)

什么是冒泡排序?

简单来说就是一个无序的列表,每次拿一个数,这个数依次和前面的数作比较,直到把它放到正确的位置,以此类推直到每个数都比较完成

我们用代码实现一下:

import random


def bubble_sort(li):
    for i in range(len(li)-1): # 第i趟
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]: # 降序改为小于号
                li[j],li[j+1]=li[j+1],li[j]


li = [random.randint(0,1000) for i in range(10)]
print(li)
bubble_sort(li)
print(li)

 代码中使用了嵌套的for循环实现,最后用random方法生成随机数测验。

第一层循环确定一个列表总共需要几趟(移动一个数为一趟),比如一个10个元素的列表,移动完9趟,最后一个数已经自动排好位置了,所以是列表长度减1。

第二层循环用图来解释:

图中橙色为有序区(已经排好的),白色为无序区(还未进行排序的),图中为第二趟(从0开始因为列表元素是从0开始的) ,此时无序区还有七个数(总共9个数),所以是列表长度减趟数。箭头依次从下往上数,直到7这个数就不会往上走了因为1上面没有可比较的数,所以还要减1。

所以第二层循环是len(li)-i-1。循环里面就是如果下面的数比上面的大就交换位置。

random函数的randint方法表示生成0-1000的随机数(包括0和1000),循环生成10个 

代码运行结果如下:

此代码有一个明显的缺点,我们在第二层循环后面加个print 打印每趟的结果,然后给他一个列表

def bubble_sort(li):
    for i in range(len(li)-1): # 第i趟
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]: # 降序改为小于号
                li[j],li[j+1]=li[j+1],li[j]
        print(li)

li = [1,2,3,4,6,5]
print(li)
bubble_sort(li)
print(li)

结果如下: 

 可以看到列表中只有5和6的顺序是错误的,第二趟顺序就已经全部对了,但是它还是执行了很多次。所以我们对代码进行一个优化,有效减少它的运行时间。

def bubble_sort(li):
    for i in range(len(li)-1): # 第i趟
        exchange = False
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]: # 降序改为小于号
                li[j],li[j+1]=li[j+1],li[j]
                exchange = True
        print(li)
        if not exchange:
            break

li = [1,2,3,4,6,5]
print(li)
bubble_sort(li)

我们在第一层循环下面加一个变量,给他赋值为False,如果某一趟结束变量的值依然为False,那就说明顺序已经对了,我们用break结束循环。

运行结果如下:

 我们用一个已经排序好的列表测试一下

li = [1,2,3,4,5]

结果:

减少了很多行结果,也就是减少了很多运行时间,所以说这是一个比较好的优化

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值