详解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 相关文章推荐
在django中使用自定义标签实现分页功能
Jul 04 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
详解python中的Turtle函数库
Nov 19 Python
在python中实现强制关闭线程的示例
Jan 22 Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
对Python _取log的几种方式小结
Jul 25 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
Python drop方法删除列之inplace参数实例
Jun 27 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 日常开发小技巧
2009/09/23 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
jquery 学习之二 属性相关
2010/11/23 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
AngularJs 常用的过滤器
2017/05/15 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
Vue精简版风格概述
2018/01/30 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
Ubuntu下安装PyV8
2016/03/13 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
Python多层装饰器用法实例分析
2018/02/09 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
医学生个人求职信范文
2013/09/24 职场文书
优秀干部获奖感言
2014/01/31 职场文书
《手指教学》反思
2014/02/14 职场文书
走群众路线剖析材料
2014/10/09 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
先进党组织事迹材料
2014/12/26 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
廉洁自律个人总结
2015/02/14 职场文书
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang