详解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使用sorted函数对列表进行排序的方法
Apr 04 Python
使用Python的Zato发送AMQP消息的教程
Apr 16 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
Python计算已经过去多少个周末的方法
Jul 25 Python
Python错误处理操作示例
Jul 18 Python
Python绘制KS曲线的实现方法
Aug 13 Python
Python实现批量执行同目录下的py文件方法
Jan 11 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
python中bytes和str类型的区别
Oct 21 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 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
Smarty安装配置方法
2008/04/10 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
javaScript基础详解
2017/01/19 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
p5.js入门教程之键盘交互
2018/03/19 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
RC4文件加密的python实现方法
2015/06/30 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
python 负数取模运算实例
2020/06/03 Python
python中数字是否为可变类型
2020/07/08 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
python爬虫工具例举说明
2020/11/30 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
Java语言的优势
2015/01/10 面试题
领导干部培训感言
2014/01/23 职场文书
农村葬礼主持词
2014/03/31 职场文书
股权转让意向书
2014/04/01 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
售后客服个人自我评价
2014/09/14 职场文书
营业员岗位职责范本
2015/04/14 职场文书