前言

冒泡排序应该是很多小伙伴的最爱,简单、直接、好理解;回顾以往参与和阅读的项目,凡是牵涉自定义排序的算法,很大一部分都在用冒泡,其中很多都忽略了一个关键点;来,咱们细细品…

正文

1. 冒泡排序算法思想

冒泡排序(Bubble Sort)是属于交换排序的一种,顾名思义,就是一个元素,依次和相邻元素进行比较(升序或降序),然后进行交换,这个过程就称为冒泡。

算法思想

  • 从前往后(或从后往前)依次比较待排序数据中相邻的两个元素的值,若符合交换条件,则进行交换,直到待排序数据比较完,这样的过程就称为“一趟”冒泡排序;最终完成排序,最多需要n-1趟排序;(n代表元素个数)。

  • 每一趟排序都让一个元素移动到最终的位置,在之后的冒泡排序中就无需再对比了

  • 如果在一趟排序过程中未发生“交换”,则算法可提前结束; 这是个关键,很多小伙伴会忽略。

2. 冒泡排序算法实现与解析

代码实现(升序):

实现

运行效果如下:

结果

步骤解析(升序):

步骤

上图步骤说明:

上图中分三趟排序,每一趟的交换过程根据箭头方向进行,其中每一行中的绿色方框代表的是当趟排序需要交互的数据。

第一趟中,对原始数据array开始遍历,这里使用的是从往后的方式;

  • 第一趟第一步,对比后面两个元素9和3, 9大于3,所以9和3交换位置;

  • 第一趟第二步,对比相邻两个元素1和3, 1小于3,不需要交换;

  • 第一趟第三步,对比相邻两个元素6和1, 6大于1,所以6和1交换位置;

  • 第一趟第四步,对比相邻两个元素5和1, 5大于1,所以5和1交换位置;

  • 第一趟第五步,对比相邻两个元素2和1, 2大于1,所以2和1交换位置;遍历完成,第一趟排序结束,得到结果1、2、5、6、3、9;这里确定了元素1的最终位置,后续不在需要对比了;代码实现是这样的,但为了好理解,画图的时候都体现了一下。

第二趟排序,接着第一趟的排序结果进行冒泡排序

  • 第二趟第一步,对比后面两个元素3和9, 3小于9,不需要交换;

  • 第二趟第二步,对比相邻两个元素6和3, 6大于3,所以6和3交换位置;

  • 第二趟第三步,对比相邻两个元素5和3,5大于3,所以5和3交换位置;

  • 第二趟第四步,对比相邻两个元素2和3, 2小于3,不需要交换;

  • 第二趟第五步,对比相邻两个元素1和2, 1小于2,不需要交换;遍历完成,第二趟排序结束,得到结果1、2、3、5、6、9;其实这步没有,因为第一步已经确定了元素1的位置,可以不进行比对;这里只是便于理解虚拟出这一步。

第三趟排序,接着第二趟排序结果进行冒泡排序

  • 依次比较第二次结果的数据,最后发现没有数据进行交互,则排序结束,数据已经排好序;不需要再遍历,到此,整个冒泡排序完成;

3. 冒泡排序算法性能分析

时间复杂度

时间复杂度最坏情况就是待排序数据和要的结果完全逆序,则需要的比较的次数为:(n-1)+(n-2)+(n-3)+…+1,则最坏的时间复杂度为O(n2)。最好的时间复杂度就是待排序数据和要的结果完全一致,则比较n-1次即可,则最好的时间复杂度为O(n);所以最后的平均时间复杂度为O(n2)。

空间复杂度
在算法核心部分只采用了固定的几个中间变量(i,j,lengh,bChange),所以算法过程中消耗的内存是一个常量,则空间复杂度为O(1)

稳定性
由于在排序过程中是通过大于符号或小于符号进行比较,当等于时是不进行位置交换的,所以此算法是稳定的

综上所述,冒泡排序的时间复杂度为O(n2),空间复杂度为O(1),是不稳定算法;

总结

冒泡排序关键点一定要注意哦:

  • 每趟排序会确定一个元素的最终位置,这个元素在下一趟排序中可以不进行比较了;

  • 如果在一趟排序中没有发生数据交换,则代表数据列表已经有序,可以终止排序啦;

从上面可以看出,冒泡排序虽然简单,但需要依次遍历元素进行比较,当数据元素过多时,比较次数就越多;那有没有减少比较次数的解决方案呢;答案当然是肯定的,下期一起来聊聊快速排序

感谢小伙伴的:点赞收藏评论,下期继续~~~

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

用得最多的冒泡排序是不是少了个关键点?相关推荐

  1. 在ATM取钱5000,查询余额却少了50000,怎么回事?

    近日有位网友反映,他在某银行的自动机取钱5000.但是取完钱之后查询余额卡上却少了50000,这到底是怎么回事呢? 在ATM上取钱5000块钱,但取完钱之后查询少了5万块钱,这种事情看着似乎不可能,但 ...

  2. 【算法入门】用Python手写五大经典排序算法,看完这篇终于懂了!

    算法作为程序员的必修课,是每位程序员必须掌握的基础.作为Python忠实爱好者,本篇将通过Python来手撕5大经典排序算法,结合例图剖析内部实现逻辑,对比每种算法各自的优缺点和应用点.相信我,耐心看 ...

  3. [-算法篇-] 开篇前言

    零.前言 [1].从冒泡排序和快速排序引入算法 [2].时间复杂度的引入 [3].空间复杂度的引入 [4].数据结构和算法之间的杂谈 复制代码 关于程序的执行 输入: 原生可用数据 = 数据获取 + ...

  4. 算法小白——基本排序算法入门

    计算的 时间复杂度(最差.平均.和最好性能),依据列表(list)的大小(n).一般而言,好的性能是O(n log n),且坏的性能是O(n^2).对于一个排序理想的性能是O(n).仅使用一个抽象关键 ...

  5. 12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?

    算法对比: 算法 时间复杂度 适合场景 冒泡排序.插入排序.选择排序 O(n2) 小规模数据 归并排序.快速排序 O(nlogn) 大规模数据 归并排序和快速排序都用到了分治思想,非常巧妙.我们可以借 ...

  6. 用Python手写五大经典排序算法,看完这篇终于懂了!

    算法作为程序员的必修课,是每位程序员必须掌握的基础.作为Python忠实爱好者,本篇东哥将通过Python来手撕5大经典排序算法,结合例图剖析内部实现逻辑,对比每种算法各自的优缺点和应用点.相信我,耐 ...

  7. 随笔(面试相关)(杂)

    最重要的还是兴趣驱动 吧,这样才更加具有行动力; oninput/onpropertychange var testinput = document.createElement('input'); i ...

  8. 2020面试准备(一)

    1 3.对测试的理解: 2 4 编程:两个栈实现一个队列(说思路) 2 7.线程和进程的区别?多线程和多进程的区别? 3 5. 数据库索引方面:MySQL 除了 B+树索引还有没有其他索引.索引优缺点 ...

  9. 【Codeforces】401C Team (01010110...)

    http://codeforces.com/contest/401/problem/C 题目中,n表示0的个数,m表示1的个数,要求两个0不能连续,三个1不能连续 还要判断能否输出满足要求的序列,不满 ...

最新文章

  1. 请问anroid怎么播放aac文件。
  2. jQuery队列控制方法详解queue()/dequeue()/clearQueue()
  3. Eval和Bind的区别
  4. 磁盘上重复的贴图在内存中也会重复存在
  5. 2018年第九届蓝桥杯C/C++ A组国赛 —— 第二题:阅兵方阵
  6. 第4章 Python 数字图像处理(DIP) - 频率域滤波4 - 单变量的离散傅里叶变换DFT
  7. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: jav
  8. jsp中%@ % 与% % 与%! %
  9. Leetcode--200. 岛屿数量
  10. python的整数类型_Python int 数字整型类型 定义int()范围大小转换
  11. 命令行下 mysql 不是内部或外部命令排查方法
  12. jeesite中activiti中的流程表梳理
  13. python 抽奖器_兄弟连学python (02) ----简易抽奖器
  14. H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器
  15. 移动硬盘加上密码_树莓派+Seafile+移动硬盘搭建私有云
  16. cmake编译时不能指定头文件路径?
  17. PADS打开.asc文件
  18. 和差化积公式 和 积化和差公式
  19. 浏览器如何清除缓存教程
  20. python文档生成_python文档生成工具:pydoc、sphinx;django如何使用sphinx?

热门文章

  1. pat 团体天梯赛 L2-012. 关于堆的判断
  2. #CSS# 初识CSS
  3. 3150 Pibonacci数 - Wikioi
  4. linux uniq命令_如何在Linux上使用uniq命令
  5. c++的进制转换函数
  6. 最近对latin-1这个字符集产生了不少好感
  7. JSTL分割字符 fn:split()
  8. 手游开发者交流会议暨OGEngine新版发布
  9. Memcached 缓存个体,对象,泛型,表
  10. hdu 2896 病毒侵袭