冒泡排序算法原理Python动画演示以及优化思路与性能分析

董付国老师Python系列教材推荐与选用参考

开学第一课:一定不要这样问老师Python问题

3000道Python习题免费在线练习

“Python小屋”1300篇历史文章分类速查表

董付国老师Python教学PPT汇总与题库分享

==============

版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。

=============

推荐教材:董付国著,《Python数据分析与数据可视化(微课版)》,ISBN:978-7-302-62420-2,清华大学出版社,2023年6月出版,2023年8月第2次印刷

配套资源:教学大纲、课件、源码、数据文件、34小时微课

01dc11fffe6e654f40da1957f7508828.jpeg

=============

问题描述:

以升序排列为例,冒泡排序每次从列表开始处向后扫描并交换不符合预期顺序要求的两个相邻元素,一遍扫描结束后把最大的元素下沉到最后的位置,然后再从头到尾扫描未排序的元素并把这些元素中的最大值下沉到倒数第二个位置(即未排序部分的最后一个位置),重复这个过程,直至不再有未排序的元素。算法原理如下图所示,初始时整个列表为未排序部分、已排序部分为空,算法结束时整个列表为已排序部分、未排序部分为空。

03341e57e79cee59495c278635bc9a7b.png

冒泡排序算法中每次交换两个相邻元素只能消除一个逆序,需要大量元素交换才能完成排序,最坏情况(所有数据的初始顺序与预期顺序完全相反)下效率非常低,但用于只需要几次遍历就可以完成排序的数据时却很有优势。作为优化,如果在某次扫描过程中没有元素需要交换则认为所有元素均已按要求排列,排序过程可以提前结束。

冒泡排序算法的时间复杂度为O(n^2),空间复杂度为O(1),属于稳定排序算法,同一个排序规则下相等的元素保持原来的相对顺序。

下面代码实现了最原始的冒泡排序算法,

95e7eeda79c170a4f72f6aa18655d1c9.png

为方便算法理解,下面的代码使用扩展库Matplotlib对上面的排序过程进行了动画可视化

71aff6e15369956274f3ade6c06c4b51.png

运行效果:

下面代码对原始的冒泡排序算法代码进行了适当优化,每次扫描时记录本次扫描有没有进行元素交换,如果没有发生元素交换则说明已排序,不需要继续扫描,可以提前结束。

26667c6c5449810b6925e8694aea0d60.png

下面代码继续优化,每次扫描中记录元素交换的位置,下次扫描时只需要扫描到上次扫描中最后一次交换元素的位置,该位置后面的元素必然是已经排序的,不需要扫描和处理。

5e617dfd04da73c78a32dae660cfc1d6.png

接下来编写代码测试不同数据分布时三种实现的效率,

710aac425a015095f3c095bcf4512300.png

运行结果:

02a2d288cd0cdbf2bbcf150bb26cde92.png

=================

温馨提示:

关注微信公众号“Python小屋”,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过200次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1300篇原创技术文章;发送消息“会议”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过700节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习3857道客观题和759道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值