冒泡排序(Bubble Sort),是经典的排序算法,基本上我们学习任何语言都会接触到冒泡排序。
它的算法思想是,重复地遍历要排序的列表,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历列表的工作是重复地进行直到没有再需要交换,也就是说该列表已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
比如我们有下面这样一个列表:

lists = [10,8,4,7,5]

每次遍历列表每个元素,然后比较前后两个元素的大小,如果前面的数大于后面的数,就交换位置,否则什么都不做。

内层循环:

下面是第一次遍历后的效果,我们将列表竖起来,可以看到最大值(10)像一条小鱼吐的一个泡泡逐渐冒到了水面

这样我们可以确定一个程序上的循环:

for j in range(len(li)-1):      # 列表中一个5个数,比较为两两比较,因此实际次数为4次if li[j] > li[j + 1]:       # 判断前面的数是否大于后面的数li[j], li[j + 1] = li[j + 1], li[j]   #大于则交换位置

语句解释:
len(li) - 1:len(li)获取列表li中的元素个数;这里我们只进行一次循环的情况,循环的次数为元素的个数-1;
li[j] > li[j + 1]:就是比较大小啦;
li[j], li[j + 1] = li[j + 1], li[j]:Python中的多元赋值,也是一种很方便的交换变量值的方式,省去了中间变量。

li[j], li[j + 1] = li[j + 1], li[j] 

等价于

temp = li[j]
li[j] = li[j+1]
li[j+1]=temp

第一轮比较已经确定最大值10,因此后面的比较10不需要参与;

第二轮比较就是len(li) -1-1,本来比较就是len(li) -1,已经有一个值不用参与了,则需要再减去1,第二轮确定次大值8;
第三轮时10,8已经确定,因此比较的次数就变成了 len(li) -1-2;
以此类推,比较的次数实际是在以递减的方式减少;
因此可以确定内层循环的最终写法:

for j in range(len(li)-1-i):      # i为一个递增的数,减去递增,就是递减嘛

每一轮循环就是将一个尚未排序的最大值进行了一次冒泡。

外层循环:

内层循环已确定,外层循环就简单了。
每次冒泡确定一个最大值,那么n个数比较,只需要进行n-1次冒泡就行了。

for i in range(len(li)-1):      # n-1次冒泡

最终结果:

li = [10,8,4,7,5]
for i in range(len(li)-1):for j in range(len(li)-1-i):      if li[j] > li[j + 1]:      li[j], li[j + 1] = li[j + 1], li[j]

算法分析:

    (1)由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数

    (2)冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。

    (3)时间复杂度

    1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

    2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

    

      综上所述:冒泡排序总的平均时间复杂度为:O(n2) ,时间复杂度和数据状况无关。

算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

python 冒泡算法相关推荐

  1. python——冒泡算法

    python--冒泡算法 1.定义: 实际上就是:对列表里的数字进行排序 2.举例: (1)使用关键字排序 升序格式:列表.sort() slist2 = [7,-9,11, -8, 98,35,17 ...

  2. python冒泡算法_python_冒泡算法

    什么是冒泡算法? -- 像鱼吐泡泡一样,每次都是向上冒出一个水泡 如何逻辑整理? -- 先拿第一个值和剩下的值,一一比较,必能找到最大的或者最小的 -- 比较过程中,第一个值小于剩下的某个值,交换位置 ...

  3. 用python实现冒泡算法

    有这样一组数列: [7,6,5,4,3,9,8,2,1], 我们想排序成这样: [1,2,3,4,5,6,7,8,9]. 要怎么做呢?第一次,我们可以把9排到最右边. 最终结果就变成这样: [6, 5 ...

  4. python语言实现冒泡算法(附代码)

    冒泡算法的基本原理就是让大的数冒泡冒到列表的最后,最大的排在最后一位,第二大的排到最后第二位,以此类推,直到整个列表遍历完整.具体的代码如下所示: num_list = [5,8,3,7,2,1,0, ...

  5. 冒泡算法Python实现

    冒泡算法基本原理 依次比较两个数的大小,如果前面那个数字比后面的数字大就交换两个数字的位置. 代码实现 依据冒泡算法原理,我们来实现排序. 首先定义一个列表: list = [12, 23, 98, ...

  6. GitHub超4.1万星,最全Python入门算法来了

    本文来自公众号:超级数学建模 微信号 :supermodeling 今天,阿广给大家推荐一个好资源,一个在 Github 上超过 2.7 万星标的项目:最全算法及Python实现. 该项目主要包括两方 ...

  7. Python 冒泡法

    Python 冒泡法 Introduction 冒泡法,也称为冒泡排序,是一种简单的排序算法,它重复地遍历要排序的列表,比较每对相邻的项,并在必要时交换它们的位置. 这个算法从底部开始,因此较小的值会 ...

  8. GitHub超 7.9 万星,最全Python入门算法!

    (给机器学习算法与Python学习加星标,提升AI技能) 来源:github 本文由新智元(AI_era)整理 今天向大家推荐一个好资源,用Python实现所有算法.该项目在Github上已经获得了超 ...

  9. GitHub超6.8万星,最全Python入门算法来了

    问耕 发自 凹非寺 [导读]Github上超过6.8万星标:最全算法及Python实现.该项目的算法包括排序.搜索等经典算法,描述较为详细,对算法原理本身.应用场景以及实现过程的可视化等. 我们讨论机 ...

最新文章

  1. centos7给MySQL配置环境变量
  2. ProGuard中keep到底有什么作用
  3. Python+Selenium学习笔记8 - 多表单多窗口切换
  4. 怎么关超声_肋骨骨折——超声的优势
  5. SQL的经典语句(太全了)
  6. Prim和Kruskal求最小生成树
  7. 别傻了,人家离职你也离
  8. 【Elasticsearch】es 各种 日志 慢日志 慢查询
  9. XSS-Game level 5
  10. 一种定力夹具控制系统
  11. CSS overflow属性与display属性
  12. 2020ccks知识图谱问答总结
  13. QStyleOption类型
  14. *CF1132D.Stressful Training(二分+队列+贪心)
  15. 戴尔发布XPS笔记本等新品;虎牙全面采用亚马逊云科技专用数据库服务 | 全球TMT...
  16. 微服务组件之限流器与熔断器
  17. 沟通的艺术:看人入里,看出人外 - part 4
  18. codeforces 821 B Okabe and Banana Trees
  19. 目前最全的机器学习知识结构图(11月1日更新)
  20. Windows 下 android自动打包 volley项目

热门文章

  1. java 多线程并行_Fork and Join: Java Can Excel at Painless Parallel Programming Too! | Oracle 中国...
  2. 做微信小程序的准备工作
  3. 阻燃计算机电缆的标准,阻燃GB12666-90标准DJVVP3-22铠装计算机电缆
  4. python显示结果带单位_python怎么设置页面显示单位
  5. 沉痛悼念恩师程开甲院士“改革子先锋”
  6. 线性代数笔记34——左右逆和伪逆
  7. chronodex怎么用_以终为始的时间流管理
  8. Transformer入门学习
  9. css 让图片不停的转动
  10. hi8pro 单安卓 32G分区教程