详解python算法之冒泡排序


Posted in Python onMarch 05, 2019

python之冒泡排序

概念: 重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

详解python算法之冒泡排序

算法原理

冒泡排序算法的原理如下:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

详解python算法之冒泡排序

算法分析

时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数

详解python算法之冒泡排序 和记录移动次数详解python算法之冒泡排序 均达到最小值:详解python算法之冒泡排序详解python算法之冒泡排序

所以,冒泡排序最好的时间复杂度为详解python算法之冒泡排序

冒泡排序的最坏时间复杂度为详解python算法之冒泡排序

代码实现

伪代码

function bubble_sort (array, length) {
  var i, j;
  for(i from 1 to length-1){
    for(j from 0 to length-1-i){
      if (array[j] > array[j+1])
        swap(array[j], array[j+1])
    }
  }
}

伪代码解释

函数 冒泡排序 输入 一个数组名称为array 其长度为length
    i 从 1 到 (length - 1)
        j 从 0 到 (length - 1 - i)
            如果 array[j] > array[j + 1]
                交换 array[j] 和 array[j + 1] 的值
            如果结束 
        j循环结束
    i循环结束
函数结束

助记码

i∈[0,N-1)        //循环N-1遍
  j∈[0,N-1-i)      //每遍循环要处理的无序部分
   swap(j,j+1)     //两两排序(升序/降序)

python代码

#-*-coding:utf-8-*-
'''冒泡排序也称 bubble sort从小到大排序'''
import time

def bubble_sort(lst):
  '''冒泡排序'''
  # 第一次循环
  for n in range(len(lst) - 1, 0, -1): #计算原列表的长度-1,取倒序索引

    for i in range(n):
      if lst[i] > lst[i + 1]:    # 比较最后一个与倒数第二个数的值,如果倒数第二个的值,大于最后一个的值
        temp = lst[i]       # 则将倒数第二个值赋值给临时变量temp
        lst[i] = lst[i + 1]    # 替换原列表中倒数第二个索引的值为最后一个
        lst[i + 1] = temp     # 同时改变原列表中最后一个索引值为倒数第二个的值
  return lst

if __name__ == "__main__":
  lst = [54, 26, 93, 17, 77, 31, 44, 55, 20]
  af_sort=bubble_sort(lst)
  print(af_sort)

总结冒泡排序的实现(类似下面)通常会对已经排序好的数列拙劣地运行(详解python算法之冒泡排序),而插入排序在这个例子只需要详解python算法之冒泡排序个运算。算法的核心知识点是: 循环比较, 交叉换位!

Python 相关文章推荐
编写Python脚本来获取Google搜索结果的示例
May 04 Python
python自动翻译实现方法
May 28 Python
python3使用SMTP发送简单文本邮件
Jun 19 Python
Numpy 改变数组维度的几种方法小结
Aug 02 Python
Python饼状图的绘制实例
Jan 15 Python
解决pyecharts在jupyter notebook中使用报错问题
Apr 23 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
Python有参函数使用代码实例
Jan 06 Python
python 实现关联规则算法Apriori的示例
Sep 30 Python
Matplotlib animation模块实现动态图
Feb 25 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
python区块链持久化和命令行接口实现简版
May 25 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 #Python
Python实现KNN(K-近邻)算法的示例代码
Mar 05 #Python
Python按钮的响应事件详解
Mar 04 #Python
Python中三元表达式的几种写法介绍
Mar 04 #Python
Python生成器的使用方法和示例代码
Mar 04 #Python
Python去除字符串前后空格的几种方法
Mar 04 #Python
python调用外部程序的实操步骤
Mar 04 #Python
You might like
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
vue-cli的eslint相关用法
2017/09/29 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
详细分析React 表单与事件
2020/07/08 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
js实现3D旋转效果
2020/08/18 Javascript
Python使用getpass库读取密码的示例
2017/10/10 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
送达通知书
2015/04/25 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
Go语言读取txt文档的操作方法
2022/01/22 Golang
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis