python算法学习(3)——冒泡排序

简单排序篇


列表排序的简单排序有三种,分别是冒泡排序、选择排序和插入排序。
这里我们来讨论冒泡排序:

冒泡排序

冒泡排序是一种经典又基础的排序算法,即对列表中的元素相邻两个进行比较,前面大于后面则交换位置。
对于该算法的逻辑体现可以看做是每一轮冒泡会将无序列表中一个最大元素“顶”到一个有序区域里,而一次又一次的冒泡不断地将元素“顶”到有序区域,直至所有元素均进入有序区域,(无序区域无元素)排序结束。
在这里插入图片描述
上图①—⑤即表示一趟冒泡将最大元素9“顶”到了有序区域(红色字)的过程
其代码表示如下:

#冒泡排序
def bubble_sort(list):
    for i in range(len(list)-1):   #第i趟冒泡
        for j in range(len(list)-i-1):
            if list[j]>list[j+1]:  #相邻两元素比较,交换位置判定
                list[j],list[j+1]=list[j+1],list[j]   #交换两元素位置
        print(list)      #每趟打印一次冒泡后的列表

li=[1,9,8,6,5,7,10]
print(li)
bubble_sort(li)          

运行结果:

[1, 9, 8, 6, 5, 7, 10]
[1, 8, 6, 5, 7, 9, 10]
[1, 6, 5, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]

由此可见,冒泡排序可以完成对列表的排序,但通过这个运行结果我们发现,从第四趟结束这个列表就已经排好序了。但由于代码没有设置停止条件,所以仍会继续运行至第n-1趟结束。
那我们就优化一下上面的代码,让其在排好序后跳出循环,避免出现资源的浪费,代码如下:

#冒泡排序优化
def bubble_sort(list):
    for i in range(len(list)-1):  #第i趟冒泡
        exchange=False
        for j in range(len(list)-1-i):
            if list[j]>list[j+1]:     #相邻两元素比较,交换位置判定
                list[j],list[j+1]=list[j+1],list[j]   #交换两元素位置
                exchange=True
        print(list)
        if not exchange:     #每一趟冒泡都进行一次判断
            return


li=[1,9,8,6,5,7,10]
print(li)
bubble_sort(li)    

其结果如下:

[1, 9, 8, 6, 5, 7, 10]
[1, 8, 6, 5, 7, 9, 10]
[1, 6, 5, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]

不难发现,相较于优化前的代码来说,运行结果减少了两次无用打印(即避免无用功的循环冒泡排序)。
顺便一提,冒泡排序的时间复杂度是O(n²)。

提示:下一篇是第二种简单排序——选择排序。

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

快快飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值