当前位置: 首页 > news >正文

Python中排序算法之冒泡排序

排序算法是将给定的数列中的数进行升序(从小到大)或者降序(从大到小)排列。冒泡排序是排序算法的一种。

1 冒泡排序的原理

1.1 基本思想

冒泡排序是将数据中较大或者较小的数据依次向右推移的一种排序技术。它的基本思想是比较相邻的两个数,以升序为例,将较小的数放在前面,较大的数放在后面。

图1 第一次“冒泡”的步骤

1.2 第一次“冒泡”

假设数列中有“8、5、9、3”四个数,如图1①所示,要使用升序的方式对这四个数进行排列。首先比较8和5这两个数,因为8比5大,将这两个数的位置进行交换,如图1②、图1③所示;接下来比较8和9,因为9比8大,此时无需交换两个数的位置,如图1③所示;最后比较9和3这两个数,因为9比3大,将这两个数的位置进行交换,如图1④、图1⑤所示。这样,经过第一轮的比较与交换位置,数列中的最大值9就被推移到最右端,就像水中的气泡一样,冒了出来,所以这种排序方式叫做“冒泡排序”。

1.3 第二次“冒泡”

在进行第二次“冒泡”时,因为数字9已经作为数列的最大值“冒”了出来,接下来比较的就是“5、8、2”这三个数,如图2①所示。

图2 第二次“冒泡”的步骤

首先比较5和8,因为8比5大,所以不交换位置,如图2①所示;接下来比较8和3,因为8比3大,所以交换两个数的位置,如图2②和图2③所示。这样,数字8作为数列的第二大数“冒”了出来。

1.4 第三次“冒泡”

最后,比较剩下的5和3,因为5大于3,所以交换两个数的位置,如图3①和图3②所示。

图3 第三次“冒泡”的步骤

相关链接1 对n个数字进行排列,需要“冒”n-1次“泡”,即进行n-1次排序。

2 冒泡排序的代码实现

对列表中的数据进行冒泡排序,实际上就是变换数据的下标(索引号)。可以通过for循环的嵌套实现升序的冒泡排序,代码如图4所示。

图4 冒泡排序的代码

其中,第1行定义了包含四个数据的列表;第2行的for循环表示排序的次数,因为之前跳到n个数据要进行n-1次排序;第3行的for循环表示每次排序所要排的数据个数,从“1 冒泡排序的原理”中举的例子可以看出,第1次循环时要排4个数字,第2次循环时要排3个数字,第3次循环时要排2个数字,因此每次循环时要排的数字个数与循环次数有关;第4和第5行代码表示如果前面的数字大于后面的数字,则交换这两个数字的位置。排序后的列表如图5所示。

图5 排序之后的列表

相关链接2 如需降序排列,则只需将图4中的第4行代码“>”改为“<”即可。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • k8s单master多node环境搭建-k8s版本低于1.24,容器运行时为docker
  • deque容器---C++
  • 第4章-06-让无头浏览器加载扩展插件
  • 小程序中使用page-container来做弹窗
  • C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码
  • 【FPGA】入门学习路线
  • 【Python系列】SQLAlchemy 基本介绍
  • 等保2.0--安全计算环境--TiDB数据库
  • ThinkPHP A表和B表一对多关联,根据B表中符合条件记录的某个字段的值对A表数据进行排序。
  • 更改网络ip地址时出现错误怎么办
  • 深度学习项目实践——qq聊天机器人(transformer)(二)配置环境与部署
  • 做影像组学+深度学习技术研究如何发表高分论文,案例解析
  • 常用Numpy操作(笔记整理)
  • (四)进入MySQL 【事务】
  • 力扣234题详解:回文链表的多种解法与模拟面试问答
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Bootstrap JS插件Alert源码分析
  • CentOS从零开始部署Nodejs项目
  • django开发-定时任务的使用
  • egg(89)--egg之redis的发布和订阅
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • python大佬养成计划----difflib模块
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SpiderData 2019年2月25日 DApp数据排行榜
  • SpringCloud集成分布式事务LCN (一)
  • 创建一个Struts2项目maven 方式
  • 分享一份非常强势的Android面试题
  • 检测对象或数组
  • 实现简单的正则表达式引擎
  • 算法-图和图算法
  • 异步
  • 终端用户监控:真实用户监控还是模拟监控?
  • python最赚钱的4个方向,你最心动的是哪个?
  • Semaphore
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #java学习笔记(面向对象)----(未完结)
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C++20) consteval立即函数
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (分布式缓存)Redis哨兵
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142