文章目录

  • 什么是冒泡排序??
  • 冒泡排序的详细过程
  • 代码实现(第一版)
  • 验证
  • 优化(一)
  • 代码实现(第二版)
  • 验证
  • 优化(二)
  • 代码实现(第三版)
  • 验证

冒泡排序是最基础的排序算法

什么是冒泡排序??

冒泡排序是一种基础的交换排序

冒泡、冒泡就像水中的气泡一样,不断的往上漂浮,而冒泡算法之所以叫冒泡算法,正是因为这种算法的每一个元素都可以像小气泡一样,一点一点的向数组的一端移动。

冒泡排序的详细过程

我们把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或等于右侧相邻的元素时,则位置不变。 详细过程如下:

不断的交换蓝色的数字

5 8 6 3 9 2 1 7
5 6 8 3 9 2 1 7
5 6 3 8 9 2 1 7
5 6 3 8 2 9 1 7
5 6 3 8 2 1 9 7
5 6 3 8 2 1 7 9

从最左端开始,数组中最大的元素9像汽水一起,漂浮到最右端
这时,冒泡排序的第一轮就完成了,有序区域目前就只有一个元素。

5 6 3 8 2 1 7 9

下面,进行第二轮排序:

5 6 3 8 2 1 7 9
5 3 6 8 2 1 7 9
5 3 6 2 8 1 7 9
5 3 6 2 1 8 7 9
5 3 6 2 1 7 8 9

第2轮结束后,数列右侧的有序区有2个元素,顺序如下:

5 3 6 2 1 7 8 9

这样不断的迭代,直到所有的元素都是有序的为止,这就是冒泡排序的整体思想。
冒泡排序是一种稳定的排序,值相等的元素并不会打乱原本的顺序。由于该排序算法每一轮都要遍历所有元素,总共遍历(元素数量-1)轮,所有平均时间复杂度是O(n^2)

代码实现(第一版)

def sort(array):for i in range(len(array) - 1):             # 外循环控制所有回合for j in range(len(array) -i -1):       # 内循环实现每一轮的冒泡处理if array[j] > array[j+1]:           # 如果左大于右,则交换array[j],array[j+1] = array[j+1],array[j]return array

验证

输入:
array = [5,8,6,3,9,2,1,7]
sort(array)
输出:
[1, 2, 3, 5, 6, 7, 8, 9]

优化(一)

有时,数组中的元素已经排好序了,但是程序还是会继续执行,一直到遍历完所有的轮数(元素个数-1)
在这种情况下,如果可以提前判断数组中元素已经排好序,并标记出来,剩下的轮数就可以不用执行了!

代码实现(第二版)

def sort(array):for i in range(len(array) -1):             # 外循环控制所有回合issorted = True                        # 判断是否排序好了,初始为truefor j in range(len(array) -i-1):       # 内循环实现每一轮的冒泡处理if array[j] > array[j+1]:          # 如果左大于右,则交换array[j],array[j+1] = array[j+1],array[j]issorted = False               # 如果有交换,说明没有排好序,则置issorted为Falseif issorted :             # 如果issorted为True说明已经交换完成了,则直接退出循环breakreturn array

验证

输入:
array = [5,8,6,3,9,2,1,7]
sort(array)
输出:
[1, 2, 3, 5, 6, 7, 8, 9]

相比第一版,第二版做了一些小的改动,利用布尔变量issorted 作为标记。如果在本轮排序中,元素交换,则说明数组无序;如果没有元素交换,则说明数组已经有序,则直接跳出大循环。

优化(二)

用一个新的数组来举例说明:

3 4 2 1 5 6 7 8

我们发现上面数组的左半部分是无序的,右半部分是有序,我们继续采用上面的代码,会出现明明右半部分已经排好序了,但是每一轮中,数组中相邻的元素还是会不断的去比较,故这块可以优化一下。

代码实现(第三版)

def sort(array):for i in range(len(array) -1):         # 外循环控制所有回合issorted = True                    # 判断是否排序好了,初始为truesortBorder = len(array) -1         # 无序数组的边界,每一次更新到这里就结束了for j in range(sortBorder):        # 内循环实现每一轮的冒泡处理if array[j] > array[j+1]:      # 如果左大于右,则交换array[j],array[j+1] = array[j+1],array[j]issorted = False           # 如果有交换,说明没有排好序,则置issorted为FalsesortBorder = j             # 将无序数组的边界更新为最后一次交换元素的位置if issorted :         # 如果issorted为True说明已经交换了,则直接退出循环breakreturn array

验证

输入:
array =[3,4,2,1,5,6,7,8]
sort(array)
输出:
[1, 2, 3, 5, 6, 7, 8]

优化二的关键问题在于数列有序区的界定。

按照现在的逻辑,有序区的长度和排序的轮数是一样的,即第一轮排序过后,有序区长度是1,第二轮排序后,有序区长度是2,等等
但实际上,有序区的长度可能要比认定的长度长很多,如上面的例子一样。
那么我们该如何解决呢? 我们可以在每一轮交换完之后,记录一下最后一次元素交换的位置,这个位置就是无序数组和有序数组的界限。

冒泡排序_Python实现相关推荐

  1. 冒泡排序_python实现冒泡排序

    冒泡排序是比较经典的面试题, 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换 ...

  2. python 冒泡排序_Python中的冒泡排序

    # 冒泡排序:排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列 # 冒泡排序是排序算法中最为基础和经典的一种算法 # ...

  3. 使用python完成冒泡排序_python 冒泡排序优化,用递归实现冒泡排序

    下面代码是冒泡排序逐步优化,写代码用递归也可以实现.什么冒泡排序就不写了,百度解释很详细.对理论不是很感兴趣. #!/usr/bin/env python3 # -*- coding: utf-8 - ...

  4. python遍历数组冒泡排序_Python算法(一) 数组冒泡排序(难度等级:easy)

    冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序. 算法原理:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队 ...

  5. c++冒泡排序_python+C、C++混合编程的应用

    TIOBE每个月都会新鲜出炉一份流行编程语言排行榜,这里会列出最流行的20种语言. 排序说明不了语言的好坏,反应的不过是某个软件开发领域的热门程度.语言的发展不是越来越common,而是越来越专注领域 ...

  6. python输入十个数用冒泡排序_python 冒泡排序法

    我们先看一个代码: 这段代码的意思是:利用随机整数函数randint()生成1到35的随机数.通过while循环10次,生 成10个这样的随机数.将生成的10个随机数组成一个列表,并用冒泡排序法来对该 ...

  7. python解题冒泡排序_python 冒泡排序,快排

    一.冒泡排序 1.1.冒泡的原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的 ...

  8. python随机生成10个数字进行冒泡排序_Python实现冒泡排序

    冒泡排序(Bubble Sort),是经典的排序算法,基本上我们学习任何语言都会接触到冒泡排序. 它的算法思想是,重复地遍历要排序的列表,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历列表 ...

  9. python列表冒泡排序_python – 冒泡排序已排序列表

    正如Jorge在回答中所示,但是没有解释(如关闭喷射)在泡泡中放置一个默认为True或False的布尔变量,无论你选择什么,如果你进行交换并将结果返回到最后,则将其值更改为oposite,如果从bub ...

  10. python实现冒泡排序完整算法_Python实现冒泡排序算法的完整实例

    冒泡排序:顾名思义就是(较小的值)像泡泡一样往上冒,(大的值)往下沉. 实现原理:依次将相邻两个数值进行比较,较小的数值移到左边,较大的数值移到右边,依次比较完第一轮后,最大的数值应该排在最右边.然后 ...

最新文章

  1. 基于Centos7构建Kubernetes平台
  2. linux core文件的打开和分析
  3. stl中Priority Queues(优先队列)的基本用法
  4. 微信小程序之视图容器(swiper)组件创建轮播图
  5. python入门之玩转列表我的菜单_我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)...
  6. 【转载】架构师需要了解的Paxos原理、历程及实战
  7. C#LeetCode刷题之#530-二叉搜索树的最小绝对差(Minimum Absolute Difference in BST)
  8. linux操作系统下建用户,如何用Linux操作系统批量建立用户的shell
  9. 设计模式09_代理模式
  10. Impala操作审计
  11. [文件、数据库、XML]window phone 利用StreamWriter写入文件问题
  12. ca锁登录显示服务器验签失败,网上报名CA登录失败解决办法
  13. html5标签参考手册
  14. 探究达梦8中索引数量与磁盘占用,查询和dml的小实验
  15. Region和Available Zone的区别
  16. 加号和减号在一起怎么读_幼儿园怎样认识加号,减号,等于号
  17. HTML5制作斑马线表格,HTML_CSS,JavaScript和MooTools制作斑马纹表格,简单的斑马纹表格,如果页面 - phpStudy...
  18. Ubuntu-Chrome 更新Flash插件
  19. Java8新特性 方法引用(三)
  20. 从coursera网站自动下载网课视频(Linux中bash操作)

热门文章

  1. Rust : 异步编程
  2. (转)惊魂24小时!真实还原光大“乌龙指”事件,比小说还离奇
  3. Rust: Rangechar 'a'..'z' 能干什么?......待续
  4. 十种程序语言帮你读懂大数据的“秘密”,Julia位列其中!(转)
  5. SpaceX上天容易,Tesla自动驾驶难 | 凌云时刻
  6. 【快讯】中国首个开源协议----木兰隆重发布
  7. 【语音加密】基于matlab GUI语音信号加密解密(带面板)【含Matlab源码 181期】
  8. 【VRP】基于matlab遗传算法求解多车辆路径规划问题【含Matlab源码 1249期】
  9. 【混凝土强度预测】基于matlab BP神经网络混凝土强度预测【含Matlab源码 695期】
  10. 【元胞自动机】基于matlab元胞自动机城市规划【含Matlab源码 125期】