活动地址:CSDN21天学习挑战赛

1.冒泡排序(Bubble Sort)

1.1 概念:

冒泡排序是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。

1.2 基本原理:

每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。

而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。

2.图示

3.代码实现(python):

def bubble_sort(l):for i in range(len(lst)): # 外循环的趟数for j in range(len(lst) - 1):if l[j] > l[j + 1]:l[j],l[j+1]=l[j+1],l[j]print(l)lst = [4, 2, 8, 0, 5, 7, 1, 3, 6, 9]
bubble_sort(lst)

优化点一:

其实我们可以看到上面的代码有可以优化的地方,每一趟外循环的时候,内循环比较包括的交换的次数是相等的,但是其实这是完全没必要的,因为每执行一次外循环之后,都会有一个极值通过冒泡变成了有序的,所以我们这个时候只需要找一下规律,看一下每一次内循环的次数应该是多少,应该是:

元素数 - 外循环的当前值 - 1

这个时候上面的元素可以优化为:

# 优化版一
def bubble_sort(l):for i in range(len(lst)):  # 外循环的趟数for j in range(len(lst) - i - 1):if l[j] > l[j + 1]:l[j], l[j + 1] = l[j + 1], l[j]print(l)lst = [4, 2, 8, 0, 5, 7, 1, 3, 6, 9]
bubble_sort(lst)

优化点二:

但其实这个算法还是有可以优化的地方,比如我们在执行了外循环的中的几趟,这个时候元素已经就全局有序了,并不需要再进行后续外循环的执行了,这个时候我们可以认为在一趟的外循环中如果一次交换都没有,那么我们就可以认为这个列表全局有序了,这个时候就可以跳出外循环,我们使用一个标记进行记录内循环中是否有元素进行交换,可以得到下面的代码:

# 优化版二
def bubble_sort(l):for i in range(len(lst)):  # 外循环的趟数is_sorted = Truefor j in range(len(lst) - i - 1):if l[j] > l[j + 1]:is_sorted = False # 有元素交换,所以不是有序,标记变为Falsel[j], l[j + 1] = l[j + 1], l[j]if is_sorted: # 一趟下来是否发生位置交换,如果没有交换直接跳出外循环breakprint(l)lst = [4, 2, 8, 0, 5, 7, 1, 3, 6, 9]
bubble_sort(lst)

优化点三:

还有一个问题。那如果数列中前半部分是无序的,后半部分是有序的呢?比如(3,4,2,1,5,6,7,8)这个数组,其实后面的许多元素已经是有序的了,但是每一轮还是白白比较了许多次呢?

如果按冒泡排序代码原始版来分析的话,有序区的长度和排序的轮数是相等的。比如第一轮排序过后的有序区长度是1,第二轮排序过后的有序区长度是2 ……。
但是呢,实际数列真正的有序区可能会大于这个长度,也就是你上面这个例子,第二轮中后面 5 个实际上都已经属于有序区了。因此后面的比较是没有意义的了。
我们可以这样做来避免这种情况:在每一轮排序的最后,记录一下最后一次元素交换的位置,那个位置也就是无序数列的边界,再往后就是有序区了。

# 优化版三
def bubble_sort(l):for i in range(len(lst)):  # 外循环的趟数is_sorted = True# 无序数列的边界,每次比较只需要比到这里为止unsorted_border = (len(lst) - i - 1) if i == 0 else unsorted_borderfor j in range(unsorted_border):if l[j] > l[j + 1]:print(l)is_sorted = False  # 有元素交换,所以不是有序,标记变为Falsel[j], l[j + 1] = l[j + 1], l[j]lastIndex = junsorted_border = lastIndexif is_sorted:breaklst = [3, 4, 2, 1, 5, 6, 7, 8]
bubble_sort(lst)

4.算法性能

4.1 时间复杂度:

由上图可知,4 个石子的时候排完序需要 3 趟,第一趟需要比较3次,第二趟需要比较2次,第三趟需要比较1次,那一共比较了 3 + 2 + 1 次;

那如果有 n 个石子呢?

那就需要 (n-1) + (n-2) +…+2+1 次,这不就是一个等差数列吗,很显然:

基本算法——冒泡排序(Python版)相关推荐

  1. 各省新高考等级赋分算法实现——python版

    各省新高考等级赋分算法实现--python版 一.前言 新高考从2014年启动,目前已经有14个地区(省.市)实行了新高考改革分别是:浙江.上海.北京.山东.天津.海南.湖南.广东.江苏.重庆.河北. ...

  2. GMM算法(python版)

    原 [machine learning]GMM算法(Python版) 一.GMM模型 事实上,GMM 和 k-means 很像,不过 GMM 是学习出一些概率密度函数来(所以 GMM 除了用在 clu ...

  3. python数据结构与算法分析_数据结构与算法(Python版)

    为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...

  4. python中用函数设计栈的括号匹配问题_数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题...

    算法 数据结构 数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题 在平时写程序当中,我们会经常遇到程序当中括号的匹配问题,也就是在程序当中左括号的数量和右括号的数量必须相等.如 ...

  5. 归并排序验证性实验_攻略 | 10 大经典排序算法(Python 版)

    全国信息学大神和家长在这里 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能 ...

  6. 图解leetcode初级算法python版 pdf_图解LeetCode初级算法(Python版)

    第1章 浅谈算法 1.1 算法概述 1.2 度量算法 1.2.1 时间复杂度 1.2.2 空间复杂度 1.3 Python&Pythonic 第2章 基础算法之排序 2.1 冒泡排序 2.1. ...

  7. leetcode中文版python,图解LeetCode初级算法(Python版)

    第1章 浅谈算法 1.1 算法概述 1.2 度量算法 1.2.1 时间复杂度 1.2.2 空间复杂度 1.3 Python&Pythonic 第2章 基础算法之排序 2.1 冒泡排序 2.1. ...

  8. 太强了,手撸一款导弹跟踪算法(Python版)

    作者:半壶砂 https://www.cnblogs.com/halfsand/p/7976636.html 这里涉及拦截导弹的自动跟踪.最近,看到了一个挺有趣的自动跟踪算法,一个Python的简单模 ...

  9. python dfs算法_LeetCode | 一文帮你搞定BFS、DFS算法(python版)

    模板方法 使用BFS,DFS的题目,在leetcode上一般标记为medium或者hard.但从思维逻辑上看,其难度定义偏高.可能从代码量来看,写一道BFS或者DFS的篇幅比其他类型的题目要多. BF ...

  10. 高效算法,B*寻路算法,python版,思维优化(1)

    上一篇文章只发布了很粗糙的代码,属于能跑就行,确实难看懂. 这一篇继续说一下爬墙思维,,B*寻路算法就是贪婪思维 +攀爬思维, 但是比较难判定怎么算爬过的障碍,所以这里改为  贪婪思维 +穿透障碍,( ...

最新文章

  1. IT人士的人际关系压力
  2. OpenAI教GPT-3学会上网,「全知全能」的AI模型上线了
  3. python语言怎么学-怎么学Python语言呢?粤嵌Python学习路线入门
  4. 2020年快手校招JAVA岗笔试第三题
  5. [react] 如何更新组件的状态?
  6. ARM CORTEX-M0 权威指南 英文
  7. ext拖动gridpanel的列组件消失_未来光伏组件市场格局:182mm市场占有率65%、210占5%、166占20%...
  8. 公开薪资后,我会被解雇吗?
  9. 交换机配置snmp/trap/静态路由/LLDP服务详细步骤/华为交换机忘记登录密码
  10. ShadowGun Billboard Blinking God Rays
  11. python学习笔记(八)传递任意数量的实参
  12. 哲学:哲学(世界观学说、社会形态之一)
  13. 无线AP和无线路由器区别 wifi热点
  14. 第15课:ul,添加新闻信息列表ol,添加图书销售排行榜
  15. 上班最强摸鱼游戏-多人联机小游戏 (一)
  16. 【笔记】为什么现代人变得越来越娱乐至死
  17. win12服务器文件设置只读,高手亲自讲解win10文件夹只读属性改不了的修复办法...
  18. HTTP状态码:204
  19. 钉钉免费内网穿透工具使用
  20. mac电脑安装nvm

热门文章

  1. 决策树,基尼系数,泰勒级数
  2. android app换肤详解
  3. 【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势
  4. android recovery 乱码,Android Recovery 支持 Adb
  5. 「游戏引擎 浅入浅出」前言
  6. PTA甲 1152~1155题解
  7. word2vec预训练词向量+通俗理解word2vec+CountVectorizer+TfidfVectorizer+tf-idf公式及sklearn中TfidfVectorizer
  8. [转载]H3CS5500交换机策略路由配置_马立杰_新浪博客
  9. 电商网站秒杀与抢购的系统架构
  10. JavaScript实现页面加载成功后刷新一遍当前页面(二)