冒泡排序(Bubble Sort):是一种简单的排序算法,也是一种稳定的排序算法。其实现原理是:依次比较两个相邻的元素,当该对元素顺序不正确时就进行交换,从左到右一轮遍历得到一个最值;重复此步骤,直到没有任何两个相邻的元素可以交换,就表明完成了排序。

简单来说,就是两两比较,不断交换,逐个推进,一轮遍历得到一个最值的方式来排序的。

冒泡排序的示例:

假设待排序序列为 5、1、4、2、8,如果采用冒泡排序对其进行升序排序,则整个排序过程如下所示:

第一轮排序能找到最大值且通过交换将其放置到最后一位,第二轮排序能找到第二大值且通过交换将其放置到倒数第二一位,第三轮排序能找到第三大值且通过交换将其放置到倒数第三一位。依次类推。

  1. 第一轮遍历:此时整个序列中的元素都位于待排序序列,依次比较每对相邻的元素,并对顺序不正确的元素进行位置交换。

    比较 4 次,从待排序序列中找到此次的最值 8,并将其放到了待排序序列的尾部,并入已排序序列中。

  2. 第二轮遍历:此时待排序序列只包含前 4 个元素,依次比较每对相邻元素,并对顺序不正确的元素进行位置交换。

    比较 3 次,从待排序序列中找到此次的最值 5,并将其放到了待排序序列的尾部,并入已排序序列中。

  3. 第三轮排序:此时待排序序列包含前 3 个元素,依次比较每对相邻元素,并对顺序不正确的元素进行位置交换。

    比较 2 次,从待排序序列中找到此次的最值 4,并将其放到了待排序序列的尾部,并入已排序序列中。

  4. 第四轮遍历:此时待排序序列包含前 2 个元素,对其进行比较,并当顺序不正确时进行交换。

    比较 1 次,从待排序序列中找到此次的最值,并将其放到了待排序序列的尾部,并入已排序序列中。

  5. 当进行第五轮遍历时,由于待排序序列中仅剩 1 个元素,无法再进行相邻元素的比较,因此直接将其并入已排序序列中,此时的序列就为已排序好的序列。

冒泡排序的效率:

冒泡排序运行效率较低。

比较次数:

上面的例子一共有 5 个数字,第一轮遍历进行了 4 次比较,第二轮遍历进行了 3 次比较,第三轮遍历进行了 2 次比较,第四轮遍历进行了 1 次比较,比较次数为:4 + 3 + 2 + 1

假设有 n 个数据项,推导公式为:(n - 1) + (n - 2) + (n - 3)+ ... +1 = n * (n - 1) / 2,因此冒泡排序真实的比较次数为 n * (n - 1) / 2

n * (n - 1) / 2 = n² / 2 - n / 2 ,根据推导大 O 表示法的规则 2 只保留最高阶项,变为 n² / 2,根据规则 3 去除最高阶项的常量,变为 ,因此冒泡排序的比较次数的大 O 表示法为 O(n²)

交换次数:

因为不可能每次比较都交换一次,因此假设有两次比较才交换一次,因此冒泡排序真实的交换次数为 n * (n - 1) / 4

由于常量不算在大 O 表示法中,因此可以认为冒泡排序的交换次数的大 O 表示法也为 O(n²)

冒泡排序的代码实现:

需要两层循环来实现:

  1. 外层循环是有 n 个元素就进行 n -1 次内层循环,寻找 n - 1 遍最值。
  2. 内层循环是两两比较相邻的元素,寻找到每次的最值并通过两两交换将其排到后面。

    下一次进行内层循环的时候就不需要比较已被找到的最值了,因此内层循环遍历的数据量是依次递减的。

// 冒泡排序:以升序为例
ArrayList.prototype.bubbleSort = function () {// 1. 获取列表长度var length = this.array.length// 2. 外层循环:第一次循环 i = length - 1,第一次循环 i = length - 2,直到 i = 0,每次内层循环都能找到一个最值并将其放置到末端,因此外层循环从大到小遍历,每次减少末端的已被放置的一个最值for (var i = length - 1; i >= 0 ; i--) {// 3. 内层循环,两两比较元素for (var j = 0; j < i; j++) {// 3.1. 比较两个相邻的元素,如果前一个元素大于后一个元素,那么交换两个元素的位置if (this.array[j] > this.array[j+1]) {this.swap(j, j+1)}}}
}// 测试冒泡排序:
list.bubbleSort()
console.log(list.toString()) // 1 2 4 5 8

【算法三】排序算法之冒泡排序相关推荐

  1. 数据结构与算法(三) 排序算法(代码示例)

    数据结构与算法三 排序算法 1. 选择排序 2. 插入排序 3. 冒泡排序 4. 归并排序 5. 快速排序 6. 希尔排序 7. 堆排序 总结 1. 选择排序 选择排序的基本原理: 对于未排序的一组记 ...

  2. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  3. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  4. 数据结构与算法之排序算法

    数据结构与算法之排序算法 排序算法的介绍 ​ 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排序的过程. 排序的分类 1)内部排序:指将需要处理的数据都加载到内部 ...

  5. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

  6. 算法---比较排序算法

    在大批量的刷题之前,做好前期的准备工作,首先明白了时间复杂度和空间复杂度的计算方法,这个在我的上一篇博文里有提到,然后对经典排序算法做一个全面了解,2017.7.13,本文大部分内容引自http:// ...

  7. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  8. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  9. 查找算法与排序算法之Python实现

    查找算法与排序算法 查找算法 顺序查找 二分查找 排序算法 冒泡排序 选择排序 简单选择排序 选择排序 插入排序 快速排序 堆排序 堆排序topk问题 归并排序 希尔排序 计数排序 桶排序 基数排序 ...

  10. 【图解算法】排序算法——快速排序

    简介 首先还是得简单的介绍一下快速排序这个算法. 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, ...

最新文章

  1. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
  2. linux 无响应_系统加固之Linux安全加固
  3. 前海理想金融联手云信,共促互联网金融领域变革
  4. 读:[你必须知道的.NET] 第五回:深入浅出关键字---把new说透
  5. HDU - 2444——The Accomodation of Students(判断二分图,二分图最大匹配)
  6. jq 在字符串中,去掉指定的元素
  7. C++PrimerPlus学习——第九章编程练习
  8. 关于Watir的upload file不能自动选择文件的解决方案
  9. 为什么阿里腾讯们都在抢夺 LoRa?| 技术头条
  10. 使用C#读写ini配置文件
  11. VS2015 优化选项的开启
  12. linux常用命令V1.1
  13. 系统设计的原则、特点与任务
  14. 计算机内存条价格,最新内存条天梯图2020 内存条全面选购指南
  15. wpf 鼠标拖动绘制几何图形
  16. java 导出word换行_[原创]java导出word的5种方式
  17. 苦涩的技术我该怎么学?Akka 实战
  18. 中英文在线翻译的方法
  19. Mybatis小知识_typeAliases/typeAliases标签作用
  20. android animator 动画

热门文章

  1. Framework学习之路(一)—— UI绘制深入源码分析
  2. 勤能补拙是良训,一分辛劳一分才【自学自检共勉】第一篇博客~
  3. mSATA 群联PS3111+长江YMTC颗粒开卡实录,PS3111开卡软件下载
  4. OpenGl L11多光源
  5. 金山毒霸2006完美梦幻无限期升级版(8月31号更新)
  6. Android Scheme跳转协议 (基础)
  7. 应用宝apk_【小镇狼人杀】新角色猜测(末尾附上应用宝下载渠道)
  8. [云盘](二)我的文件和共享列表后台实现
  9. “微名片”开启互联网运营新模式 消费者变身经营者
  10. MySQL_高级_笔记