对于一个数组:[4, 6, 3, 9]

第一轮:

第一次比较(4<6):两数不用进行交换 数组不变为[4, 6, 3, 9]

第二次比较(6>3):两数进行交换 得到一个新数组[4, 3, 6, 9]

第三次比较(6<9):两数不用进行交换 数组不变为[4, 3, 6, 9]

存在一个数归位 即9

第二轮:

第一次比较(4>3):两数进行交换 得到一个新数组[3, 4, 6, 9]

第二次比较(3<6):两数不用进行交换 数组不变为[3, 4, 6, 9]

存在一个数归位 即6

第三轮:

第一次比较(3<4):两数不用进行交换 数组不变为[3, 4, 6, 9]

存在一个数归位 即4

然后得到一个升序排序的数组[3, 4, 6, 9] 即为结果

结论:

如果前提条件为外层循环从1开始计数的话 那么就有以下结论:

总轮数 = 元素总个数 - 1

当前轮数(i)对应的总比较次数 = 元素总个数 - i

但是一般来说外层循环从0开始计数 所以就有以下结论:

总轮数 = 元素总个数 - 1

当前轮数(i)对应的总比较次数 = 元素总个数 - i - 1

下列是冒泡排序的图解:

冒泡排序图解.xmind

接下来是冒泡排序的代码实现:

# 这是冒泡排序的简易版本
# 定义一个函数 用于对原始数组进行冒泡排序 接收一个参数 即原数组
def bubbleSort(arr):# 定义两层循环 外层循环表示轮数 内层循环表示比较次数for i in range(len(arr) - 1):for j in range(len(arr) - i - 1):# 如果存在相对靠前元素大于相对靠后元素的情况 那么就请交换两元素if arr[j] > arr[j + 1]:# 交换两元素temp = arr[j]arr[j] = arr[j + 1]arr[j + 1] = temp
if __name__ == '__main__':# 定义一个数组arr = [4, 6, 3, 9]# 打印排序前的数组print(arr)# 调用冒泡排序函数 对原始数组进行升序排序bubbleSort(arr)# 打印排序后的数组print(arr)

但是上述代码其实存在三处需要优化的地方:

1.针对特殊情况 没有处理机制

2.当冒泡排序进行到中间阶段的时候 就已经完成升序排序了

3.冒泡排序中某个阶段的数组是由前面的无需部分和后面的有序部分组成的 那么我们排序的范围不是整个范围 而是前面的无序部分

所以经过优化后的数组如下所示:

# 这是冒泡排序的优化版本
# 定义一个函数 用于对原始数组进行冒泡排序 接收一个参数 即原数组
def bubbleSortOptimization(arr):# 定义一个变量 用于记录边界 初始值为len(arr)-0-1 即len(arr)-1sortBorder = len(arr) - 1# 定义一个变量 用于记录最后进行交换元素中的相对靠前元素 初始值为0lastExchangeIndex = 0# 针对特殊情况 需要由特殊的处理机制if arr == None or len(arr) < 2:return# 定义两层循环 外层循环表示轮数 内层循环表示比较次数for i in range(len(arr) - 1):# 定义一个变量 用于判断内层循环是否存在两数交换的情况 初始值为TrueisSort = Truefor j in range(sortBorder):# 如果存在相对靠前元素大于相对靠后元素的情况 那么就请交换两元素if arr[j] > arr[j + 1]:# 当存在相对靠前元素大于相对靠后元素的情况时 将isSort变量赋值为FalseisSort = False# 交换两元素temp = arr[j]arr[j] = arr[j + 1]arr[j + 1] = temp# 为lastExchange变量重新赋值 lastExchangeIndex = j# 如果内层循环不存在两数交换的情况 那么就跳出循环if isSort:break# 为边界变量重新赋值sortBorder = lastExchangeIndex
if __name__ == '__main__':# 定义一个数组arr = [4, 6, 3, 9]# 打印排序前的数组print(arr)# 调用冒泡排序函数 对原始数组进行升序排序bubbleSortOptimization(arr)# 打印排序后的数组print(arr)

冒泡排序--python(详解)相关推荐

  1. python选择排序从大到小_经典排序算法和Python详解之(一)选择排序和二元选择排序...

    本文源自微信公众号[Python编程和深度学习]原文链接:经典排序算法和Python详解之(一)选择排序和二元选择排序,欢迎扫码关注鸭! 扫它!扫它!扫它 排序算法是<数据结构与算法>中最 ...

  2. python input与返回值-Python 详解基本语法_函数_返回值

    Python 详解基本语法 概要: 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返回给程序再由程序作出进一步的操作.可以说是函数的返回值令 ...

  3. Java冒泡排序(详解)

    Java中冒泡排序(详解) 冒泡排序 冒泡排序(默认升序),就是通过双重循环,相邻位置的元素相比较,如若前一个数字大于后一个数字,则向后移动一位,知道完成第一轮排序,最后一位数字即为所需排序数字中的最 ...

  4. 十大经典排序算法-冒泡排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  5. qpython能使用json吗l_[python] 详解Python在使用JSON时需要注意的编码问题

    Python 中的字符编码 在 Python3 中, 字符 在内存中是使用 Unicode 存储的, 常规的字符使用 两个字节 表示, 一些很生僻的字符就需要 四个字节. 默认使用 Unicode 存 ...

  6. map函数的用法python,详解Python map函数及Python map()函数的用法

    python map函数 map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list ...

  7. 名片管理系统python详解_详解Python做一个名片管理系统

    详解Python做一个名片管理系统 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  详解Python做一个名片管理系统.txt ] (友情提示:右键点上行txt文 ...

  8. 冒泡排序原理详解及代码实现

    1.冒泡排序数组排序常用的一种方式,为什么要叫冒泡排序呢?这还要从它的原理说起. 2.代码实现(低效版) 3.原理详解:冒泡排序最基本的思想就是从左到右依次判断相邻的两个数的大小关系,如果前面的数大于 ...

  9. Python常见排序之冒泡排序(详解)

    一.为啥叫冒泡排序呢?因为越小的元素会经由交换慢慢"浮"到数列的顶端(升序或降序排列),就如同碳酸饮料中co2的气泡最终会上浮到顶端一样,故名"冒泡排序". 二 ...

最新文章

  1. Handler消息机制(三):一个线程有几个Looper?如何保证?
  2. 反编译得到的java文件好多错误 val$query什么意思_这部分代码有错么?一直提示输入框$(#msg).val()得到的值未定义...
  3. linux正则表达式_号称“天书”的正则表达式,要这么来讲,我小学三年级已经满分了
  4. Android学习笔记之SoftReference软引用,弱引用WeakReference
  5. 常见缓存算法和LRU与LFU的c++实现
  6. node 的path模块中 path.resolve()和path.join()的区别
  7. js判断是否以xxx结尾
  8. 第1章 别让医生欺负你
  9. 黑马程序员 java了解和DOS命令
  10. c语言实训项目,C语言项目实训教程
  11. 计算机毕业设计Java乡村基层政务管理系统(源码+系统+mysql数据库+Lw文档)
  12. python将列表元素全部小写_python实现创建新列表和新字典,并使元素及键值对全部变成小写...
  13. 网站服务器坏了要修多久,大学服务器电脑坏了,一分钟修好收500,朋友:有钱不挣是傻子!...
  14. pysot 中的异步多进程切图
  15. 2022最新独立版智狐聚合支付v1.0.5.21_聚合支付系统源码
  16. Python 文件查找
  17. uCOS-II 基础入门教程(九)
  18. 1558_AURIX_TC275_RCU模块中的ESR管脚
  19. 金立android 7.1.1,金立K30Pro正式上市:运行安卓7.1.1系统,699元起
  20. 干式离合器与湿式离合器有什么区别(转载)

热门文章

  1. 十月 Z 星月度速览 | Hacktoberfest 开源挑战赛、飞书深诺电商场景实践、Paddlepaddle推荐系统部署……...
  2. lua怎么嵌入php,Lua教程(一):在C++中嵌入Lua脚本
  3. 前端实习面试题(自己当笔记用)
  4. 波士顿房价的三种预测方式(模型预测,最小二乘法,多元线性回归)
  5. Cannot make QOpenGLContext current in a different thread : PyQt多线程崩溃的解决方法
  6. 游戏数值策划属性篇(一):关于属性设计的几点思考
  7. Crypto++编译使用
  8. RFID期末复习 四、五、六、七章节
  9. 傅里叶变换、离散余弦变换、拉普拉斯变换、Z变换
  10. 股权融资的有哪些方式