详解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中给List添加元素的4种方法分享
Nov 28 Python
python获取当前日期和时间的方法
Apr 30 Python
用Python计算三角函数之acos()方法的使用
May 15 Python
python开发中range()函数用法实例分析
Nov 12 Python
Python遍历字典方式就实例详解
Dec 28 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
Python运算符+与+=的方法实例
Feb 18 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 Python
Python一行代码实现自动发邮件功能
May 30 Python
Python装饰器详细介绍
Mar 25 Python
Python 中面向接口编程
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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
Cakephp 执行主要流程
2010/03/24 PHP
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
简单学习Python time模块
2016/04/29 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
国际商务专业求职信
2014/07/15 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
毕业酒会致辞
2015/07/29 职场文书
爱护环境建议书
2015/09/14 职场文书
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL
Python 实现Mac 屏幕截图详解
2021/10/05 Python
golang实现浏览器导出excel文件功能
2022/03/25 Golang