详解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简单实现TCP包发送十六进制数据的方法
Apr 16 Python
Python PyQt4实现QQ抽屉效果
Apr 20 Python
Python实现字典(dict)的迭代操作示例
Jun 05 Python
python读取TXT每行,并存到LIST中的方法
Oct 26 Python
pytorch 调整某一维度数据顺序的方法
Dec 08 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
浅谈python标准库--functools.partial
Mar 13 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
在pycharm中创建django项目的示例代码
May 28 Python
python如何运行js语句
Sep 09 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 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
解析crontab php自动运行的方法
2013/06/24 PHP
帝国cms常用标签汇总
2015/07/06 PHP
php类自动加载器实现方法
2015/07/28 PHP
JS继承 笔记
2011/07/13 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
python Socket之客户端和服务端握手详解
2017/09/18 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
在notepad++中实现直接运行python代码
2019/12/18 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
C#软件工程师英语面试题
2015/06/07 面试题
介绍一下write命令
2014/08/10 面试题
大学应届毕业生个人求职信
2013/09/23 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
经销商年会策划方案
2014/05/29 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
婚宴来宾致辞
2015/07/28 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers
Python Django项目和应用的创建详解
2021/11/27 Python
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS