【算法三】排序算法之冒泡排序
冒泡排序(Bubble Sort):是一种简单的排序算法,也是一种稳定的排序算法。其实现原理是:依次比较两个相邻的元素,当该对元素顺序不正确时就进行交换,从左到右一轮遍历得到一个最值;重复此步骤,直到没有任何两个相邻的元素可以交换,就表明完成了排序。
简单来说,就是两两比较,不断交换,逐个推进,一轮遍历得到一个最值的方式来排序的。
冒泡排序的示例:
假设待排序序列为 5、1、4、2、8,如果采用冒泡排序对其进行升序排序,则整个排序过程如下所示:
第一轮排序能找到最大值且通过交换将其放置到最后一位,第二轮排序能找到第二大值且通过交换将其放置到倒数第二一位,第三轮排序能找到第三大值且通过交换将其放置到倒数第三一位。依次类推。
第一轮遍历:此时整个序列中的元素都位于待排序序列,依次比较每对相邻的元素,并对顺序不正确的元素进行位置交换。
比较 4 次,从待排序序列中找到此次的最值 8,并将其放到了待排序序列的尾部,并入已排序序列中。
第二轮遍历:此时待排序序列只包含前 4 个元素,依次比较每对相邻元素,并对顺序不正确的元素进行位置交换。
比较 3 次,从待排序序列中找到此次的最值 5,并将其放到了待排序序列的尾部,并入已排序序列中。
第三轮排序:此时待排序序列包含前 3 个元素,依次比较每对相邻元素,并对顺序不正确的元素进行位置交换。
比较 2 次,从待排序序列中找到此次的最值 4,并将其放到了待排序序列的尾部,并入已排序序列中。
第四轮遍历:此时待排序序列包含前 2 个元素,对其进行比较,并当顺序不正确时进行交换。
比较 1 次,从待排序序列中找到此次的最值,并将其放到了待排序序列的尾部,并入已排序序列中。
当进行第五轮遍历时,由于待排序序列中仅剩 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 去除最高阶项的常量,变为 n²
,因此冒泡排序的比较次数的大 O 表示法为 O(n²)
。
交换次数:
因为不可能每次比较都交换一次,因此假设有两次比较才交换一次,因此冒泡排序真实的交换次数为 n * (n - 1) / 4
。
由于常量不算在大 O 表示法中,因此可以认为冒泡排序的交换次数的大 O 表示法也为 O(n²)
。
冒泡排序的代码实现:
需要两层循环来实现:
- 外层循环是有 n 个元素就进行 n -1 次内层循环,寻找 n - 1 遍最值。
- 内层循环是两两比较相邻的元素,寻找到每次的最值并通过两两交换将其排到后面。
下一次进行内层循环的时候就不需要比较已被找到的最值了,因此内层循环遍历的数据量是依次递减的。
// 冒泡排序:以升序为例
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. 选择排序 2. 插入排序 3. 冒泡排序 4. 归并排序 5. 快速排序 6. 希尔排序 7. 堆排序 总结 1. 选择排序 选择排序的基本原理: 对于未排序的一组记 ...
- 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...
- c++ 二维数组 排序_【算法】排序算法之计数排序
前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...
- 数据结构与算法之排序算法
数据结构与算法之排序算法 排序算法的介绍 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排序的过程. 排序的分类 1)内部排序:指将需要处理的数据都加载到内部 ...
- 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第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 第 ...
- 算法---比较排序算法
在大批量的刷题之前,做好前期的准备工作,首先明白了时间复杂度和空间复杂度的计算方法,这个在我的上一篇博文里有提到,然后对经典排序算法做一个全面了解,2017.7.13,本文大部分内容引自http:// ...
- 十大经典排序算法-桶排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- 查找算法与排序算法之Python实现
查找算法与排序算法 查找算法 顺序查找 二分查找 排序算法 冒泡排序 选择排序 简单选择排序 选择排序 插入排序 快速排序 堆排序 堆排序topk问题 归并排序 希尔排序 计数排序 桶排序 基数排序 ...
- 【图解算法】排序算法——快速排序
简介 首先还是得简单的介绍一下快速排序这个算法. 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, ...
最新文章
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
- linux 无响应_系统加固之Linux安全加固
- 前海理想金融联手云信,共促互联网金融领域变革
- 读:[你必须知道的.NET] 第五回:深入浅出关键字---把new说透
- HDU - 2444——The Accomodation of Students(判断二分图,二分图最大匹配)
- jq 在字符串中,去掉指定的元素
- C++PrimerPlus学习——第九章编程练习
- 关于Watir的upload file不能自动选择文件的解决方案
- 为什么阿里腾讯们都在抢夺 LoRa?| 技术头条
- 使用C#读写ini配置文件
- VS2015 优化选项的开启
- linux常用命令V1.1
- 系统设计的原则、特点与任务
- 计算机内存条价格,最新内存条天梯图2020 内存条全面选购指南
- wpf 鼠标拖动绘制几何图形
- java 导出word换行_[原创]java导出word的5种方式
- 苦涩的技术我该怎么学?Akka 实战
- 中英文在线翻译的方法
- Mybatis小知识_typeAliases/typeAliases标签作用
- android animator 动画
热门文章
- Framework学习之路(一)—— UI绘制深入源码分析
- 勤能补拙是良训,一分辛劳一分才【自学自检共勉】第一篇博客~
- mSATA 群联PS3111+长江YMTC颗粒开卡实录,PS3111开卡软件下载
- OpenGl L11多光源
- 金山毒霸2006完美梦幻无限期升级版(8月31号更新)
- Android Scheme跳转协议 (基础)
- 应用宝apk_【小镇狼人杀】新角色猜测(末尾附上应用宝下载渠道)
- [云盘](二)我的文件和共享列表后台实现
- “微名片”开启互联网运营新模式 消费者变身经营者
- MySQL_高级_笔记