一、冒泡排序简介

冒泡排序(Bubble Sort)是一种常见的排序算法,相对来说比较简单。

冒泡排序重复地走访需要排序的元素列表,依次比较两个相邻的元素,如果顺序(如从大到小或从小到大)错误就交换它们的位置。重复地进行直到没有相邻的元素需要交换,则元素列表排序完成。

在冒泡排序中,值最大(或最小)的元素会通过交换慢慢“浮”到元素列表的“顶端”。就像“冒泡”一样,所以被称为冒泡排序。

二、冒泡排序原理

冒泡排序的原理如下:

1. 比较相邻的两个元素。如果第一个比第二个大则交换他们的位置(升序排列,降序则反过来)。

2. 从列表的开始一直到结尾,依次对每一对相邻元素都进行比较。这样,值最大的元素就通过交换“冒泡”到了列表的结尾,完成第一轮“冒泡”。

3. 重复上一步,继续从列表开头依次对相邻元素进行比较。已经“冒泡”出来的元素不用比较(一直比较到结尾也可以,已经“冒泡”到后面的元素即使比较也不需要交换,不比较可以减少步骤)。

4. 继续从列表开始进行比较,每轮比较会有一个元素“冒泡”成功。每轮需要比较的元素个数会递减,一直到只剩一个元素没有“冒泡”时(没有任何一对元素需要比较),则列表排序完成。

以列表 [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21] 进行升序排列为例。列表的初始状态如下图。

要进行升序排列,则大的元素要依次“冒泡”到列表的结尾。

1. 从列表的开头,比较相邻的两个元素,如果第一个值比第二个值大则交换。10小于17,不需要交换。

2. 向列表的结尾方向“走访”,比较第二组相邻的元素(第二个和第三个),如果不是从小到大则交换。17小于50,不需要交换。

3. 继续“走访”,比较第三组相邻的元素,如果不是从小到大则交换。50大于7,所以需要交换。

4. 对顺序错误的元素进行位置交换。交换50和7的位置。

5. 一直“走访”到结尾,第一轮“冒泡”结束后,值最大的元素“冒泡”到了列表的结尾。50“冒泡”到了列表结尾。

在下一轮“冒泡”中,不需要再将50进行比较,需要比较的元素个数减1。

6. 从列表开头,重复下一轮“冒泡”,每进行一轮“冒泡”,需要比较的元素都少一个,直到没有元素对需要比较时,整个列表排序完成。排序结果如下图。

三、Python实现冒泡排序

# coding=utf-8

def bubble_sort(array):

for i in range(1, len(array)):

for j in range(0, len(array)-i):

if array[j] > array[j+1]:

array[j], array[j+1] = array[j+1], array[j]

return array

if __name__ == '__main__':

array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]

print(bubble_sort(array))

运行结果:

[5, 7, 10, 15, 17, 21, 24, 27, 30, 36, 45, 50]

代码中,i 表示第几轮“冒泡”,j 表示“走访”到的元素索引。每一轮“冒泡”中,j 需要从列表开头“走访”到 len(array) – i 的位置。

四、冒泡排序的时间复杂度和稳定性

1. 时间复杂度

在没有特殊说明时,一般都是计算最坏时间复杂度。

在冒泡排序中,最坏的情况是元素列表的初始状态是完全逆序排列的,需要进行 n-1 轮“冒泡”,每一轮“冒泡”需要进行 n-i 次比较和交换操作。i 的平均值为 n/2 ,时间复杂度为 T(n)=n(n-1)/2 ,再乘每次操作的步骤数(常数,不影响大O记法),所以冒泡排序的时间复杂度为 O(n^2) 。

2. 稳定性

排序算法的稳定性指,当元素列表中有相等的元素时,相等元素的相对次序是否固定不变,如果相对次序固定不变,则排序算法是稳定的,反之。

在冒泡排序中,每次比较两个元素,当元素的大小顺序错误时才会进行交换,如果元素列表中有两个相等的元素,它们最终肯定会相邻在一起,但对它们比较时不会进行交换,相对次序是保持不变的。所以冒泡排序是一种稳定的排序算法。

冒泡排序优化:将时间复杂度降为O(n)

def bublle_sort(alist):

"""冒泡排序"""

n = len(alist)

for j in range(n-1):

count = 0

for i in range(0, n-1-j):

#从头走到为

if alist[i]>alist[i+1]:

alist[i],alist[i+1] = alist[i+1],alist[i]

count +=1

if 0 == count:

break

if __name__ == "__main__":

li = [54,25,93,17,77,31,44,55,20,10]

print(li)

bublle_sort(li)

print(li)

如有失效,请留言告知丨转载请注明原文链接:Python冒泡排序及优化

python 冒泡排序及优化_Python冒泡排序及优化相关推荐

  1. python linux 优化_Python 代码性能优化技巧

    Python 性能优化除了改进算法,选用合适的数据结构之外,还有几种关键的技术,比如将关键 python 代码部分重写成 C 扩展模块,或者选用在性能上更为优化的解释器等,这些在本文中统称为优化工具. ...

  2. python数据库优化_python | Mysql性能优化一

    对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF) 添加适当索引(index) [四种: 普通索引.主键索引.唯一索引unique.全文索引] 分表技术(水平分割.垂直分割) ...

  3. python进行冒泡排序详解_python冒泡排序详解

    要学习冒泡排序必须知道它的原理: 冒泡排序算法的原理如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该 ...

  4. 优化的交换排序(冒泡排序)_C程序实现优化的冒泡排序

    优化的交换排序(冒泡排序) Bubble Sort is a simple, stable, and in-place sorting algorithm. Due to its simplicity ...

  5. python中if的效率_Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  6. python遗传算法有多慢_python遗传算法的优化过程是什么?

    对于题目中的算法,相信大家最喜欢,或者最常见的就是在优化领域吧,小编就看到很多大神,利用python的算法去做一些项目的优化,而大家在足够了解这个算法以后,也需要去完成这个算法的优化,这样才是真正可以 ...

  7. python图片读取优化_Python下图片的高斯模糊化的优化

    资源下载 #本文PDF版下载 Python下图片的高斯模糊化的优化(或者单击我博客园右上角的github小标,找到lab102的W6目录下即可) #本文代码下载 高斯模糊(一维)优化代码(和本文方法集 ...

  8. python粒子群喷发_Python基于粒子群优化的投资组合优化研究

    原文链接:http://tecdat.cn/?p=6811 我今年的研究课题是使用粒子群优化(PSO)的货币进位交易组合优化.在本文中,我将介绍投资组合优化并解释其重要性.其次,我将演示粒子群优化如何 ...

  9. python 组合优化_python基于粒子群优化的投资组合优化研究

    我今年的研究课题是使用粒子群优化(PSO)的货币进位交易组合优化.在本文中,我将介绍投资组合优化并解释其重要性.其次,我将演示粒子群优化如何应用于投资组合优化.第三,我将解释套利交易组合,然后总结我的 ...

最新文章

  1. 密度聚类、密度聚类过程、OPTICS算法
  2. js调用java代码返回解决方案
  3. “极品时刻表”被挂马 已有6万网民遭攻击
  4. js 浏览器复制功能
  5. 每日总结app_每日复盘不会写,怎么办?送你一份每日复盘总结模板
  6. 谷歌宣布关闭Google TV,由Android TV接任
  7. mac 安装 PyAudio
  8. 手把手教会使用YOLOv5训练VOC2007数据集
  9. 修改才是写作的本质所在
  10. P2P加速系统解决方案
  11. 文献检索--系统综述与meta分析
  12. 计算机网络(谢希仁-第八版)第一章习题全解
  13. RxSwift-内存管理
  14. 阿里巴巴集团去IOE运动的思考与总结
  15. QT实现图片的滚轮缩放、框选放大、拖拽移动
  16. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror【zt】
  17. K8S太火了!花10分钟玩转它不香么,面试必备知识点
  18. 关于Socket粘包、半包问题的解决方法
  19. 苹果手机计算机怎么看之前的记录,苹果怎么查之前的通话记录吗(苹果手机怎么查通话录音内容)...
  20. CAD字体库大全2007-2020版本图案填充背景图纸字体符号问号乱码

热门文章

  1. auto.js 简单入门教程
  2. Frameset打印frame的问题(downmoon)
  3. mysql忽略大小写jpa解决_春数据JPA查询生成忽略大小写,以避免列数据
  4. ideal的tomcat 没有artifact
  5. React中无限级嵌套路由的实现(RRD-V6)
  6. 计算机毕业生工作经验心得
  7. 创业公司后台技术栈搭建方案
  8. MySQL之索引原理
  9. 怎么用正则表达式判断字符串既含有字母也含有数字
  10. docker快速搭建smokeping