冒泡排序在排序算法中是最简单的一种,它通过多次遍历列表,将最大的元素冒泡到列表的头部或尾部。我们通过对四张扑克牌(花色相同)以从小到大的方式进行排序来演示该算法的工作原理。首先将扑克牌面朝上放在桌上,如下图所示:

该算法要求多次遍历扑克,每次都从头开始,并在上一次遍历的前一张结束。在每一次遍历中,总是从前两张牌开始。如果前者比后者大,则交换位置。

然后比较第二张和第三张,同样如果前者更大则互换,否则保持原样。

这样依次类推,直到将最大的那一张牌移动到最后。

下图演示了接下来的两次遍历。第二次遍历将会使第二大的牌交换至倒数第二的位置上,第三次只需比较头两张,然后整个流程结束。

下面是Python版的冒泡排序:

# Sorts a sequence in ascending order using the bubble sort algorithm.

def bubbleSort( theSeq ):

n = len( theSeq )

# Perform n-1 bubble operations on the sequence

for i in range( n - 1 ) :

# Bubble the largest item to the end.

for j in range( i + n - 1 ) :

if theSeq[j] > theSeq[j + 1] : # swap the j and j+1 items.

tmp = theSeq[j]

theSeq[j] = theSeq[j + 1]

theSeq[j + 1] = tmp

冒泡排序的效率仅仅取决于列表中元素的个数,与元素的值和初始序列无关。为了确认其效率,我们必须知道一个含有N个元素的列表在排序时内层循环总的执行次数。外层一共会循环n - 1次,因为需要遍历n - 1次列表。而内层循环不定,第一次列表遍历执行n - 1次,第二次n - 2次,第三次则是n - 3次,直到最后一次遍历内层只需执行1次即可。这样,内部循环总的遍历次数是前n - 1个整数的总和,即等同于:

得到其时间复杂度为O(n2)。正因如此,冒泡排序是排序算法中效率最低的一种。如果给定一个倒序的列表,那每次迭代的内层循环中都会做交换操作,这在实际操作中无疑是非常耗性能的。

在前面的代码中,其内层循环总是n2,但如果给定序列已经是排好序的呢?该情况下,排序实际是不需要的,但代码并不知情,它依然如此辛勤劳作,以至于其性能依旧是n2。

更多请参考:Rance D. Necaise - 《Data Structures and Algorithms Using Python》

python中排序从小到大_从Python看排序:冒泡排序相关推荐

  1. python中 什么意思_请问python中%代表什么意思?

    婷婷同学_ 1.格式符例如:a = 'test'print 'it is a %s' %(a)打印的结果就是 it is a test2.单独看%,是一个运算符号,求余数.例如:求模运算,相当于mod ...

  2. python中的帮助_在Python中使用help帮助

    原博文 2014-10-18 23:21 − 在Python中使用help帮助 >>> import numpy >>> help(numpy.argsort) H ...

  3. python中if控制语句_了解Python控制流语句——if语句

    控制流 截止到现在,在我们所看过的程序中,总是有一系列语句从上到下精确排列,并交由 Python 忠实地执行.如果你想改变这一工作流程,应该怎么做?就像这样的情况:你需要程序作出一些决定,并依据不同的 ...

  4. 在python中设置密码登录_在python中生成密码

    在python中生成密码 我想在python中生成一些字母数字密码. 一些可能的方法是: import string from random import sample, choice chars = ...

  5. python中select模块_基于python select.select模块通信的实例讲解 如何用python写个串口通信的程序...

    python socket怎么利用select实现双工通信 方法: Before : 0000000000000000000000000000000000000000 After pack: 0100 ...

  6. python中mod运算符_自定义 Python 类中的运算符和函数重载(上)

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 f ...

  7. python中定义无符号整数_在python中如何将有符号整数转换为无符号整数

    要获得与C类型转换相等的值,只需按位并使用适当的掩码.e. g.如果unsigned long是32位:>>> i = -6884376 >>> i & 0 ...

  8. lambda在python中的用法_在python中对lambda使用.assign()方法

    我在Python中运行以下代码:#Declaring these now for later use in the plots TOP_CAP_TITLE = 'Top 10 market capit ...

  9. python中class变量_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  10. python中__init__方法_关于python中__init__方法理解

    在理解__init__方法之前,我们需要搞明白,什么时候才需要用到的这个方法 什么是__init__? __init__方法在python中是类的初始化,通俗来讲,就是每次只要你去创建一个类的实例对象 ...

最新文章

  1. ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务-Oracle连接错误
  2. 实战2--应用EL表达式显示投票结果
  3. java jdk下载过慢 解决方案
  4. 【深度学习笔记】关键点检测——标签(Ground Truth)构建
  5. vim 居中光标所在行(转载)
  6. 【PC工具】200324更新百度网盘下载工具——最新百度网盘下载工具使用方法及注意事项...
  7. 遍历XML引擎版本以适应代码
  8. [POJ1338]Ugly Numbers
  9. 关于Mysql DATE_FORMAT() 日期格式
  10. 逆波兰计算器android源码简书,计算器的核心算法-JavaScript实现(逆波兰表达式)...
  11. 【转】“线程间操作无效: 从不是创建控件的线程访问它”
  12. JPA、Hibernate、Mybatis的区别
  13. js判断是否为ie浏览器
  14. java学习软件_刚学习java,用哪些学习软件比较好?
  15. 【2021山东大学数字逻辑实验7】异步模8加1计数器
  16. 肝了这篇文章,我对服务器硬件有了深刻的认识!
  17. Java成神之路(持续更新)
  18. DirectX11 交换链是什么
  19. springboot学习中的错误
  20. 静态语言采用什么方式执行 如c语言,编程语言的两种执行方式

热门文章

  1. 【渝粤教育】广东开放大学 数据结构 形成性考核 (30)
  2. 为什么BAT这些大企业都喜欢用LoRa技术?
  3. 分数化简_分数应用题七讲 (一) 图示法解分数应用题
  4. #让人物运动_篮球人物之黄云龙,淡泊名利的他是篮球运动员中的楷模,你可记得...
  5. matlab 进度条/waitbar 显示运行进度
  6. 马尔可夫决策过程 Markov decision process MDP, 连续时间Markov chain, CMDP(全)
  7. printf sizeof c语言,你可能对 sizeof(i++) 有点误解。。。
  8. 连不上机器判断机器状态_KUKA机器人为什么KPP故障联不上,断电重启hou报RDC连接连接不上...
  9. 鸿蒙系统6月可升级,华为鸿蒙2.0系统大规模升级从6月开始?
  10. usb转ttl模块与matlab,USB接口转TTL小板的自检测试