577-冒泡排序算法的思想和性能分析
冒泡排序算法的思想
上图是无序的数据,要进行排序。
冒泡排序就是:
每一趟都是从开始的这个元素,两两进行比较,把大的元素往下交换(沉淀到底),把小的元素往上交换(冒泡),每一趟操作的数据都是除去前面的每一趟沉淀到底的数据之外的数据
每一趟处理的方式是一样的,只是数据量是不同的。
第一趟:从开始的这个元素,两两进行比较,把大的元素往下交换(沉),把小的元素往上交换(冒泡)
第一趟下来,整体没排序,但是把整个序列的最大值94沉到底了,
第二趟:不用处理94了,我们的目的是每一趟把当前处理的序列的最大值沉到底。所以,我们第二趟处理除94外的其他数据就可以了。
第三趟:处理除94和91外的其他数据
以此类推下去。
冒泡排序的优化
是在第8趟,把9沉到底了,但是此时的整个序列已经是有序的了,不用做下一趟了。
我们都是在原来的数组上操作的,进行数据的交换的,并没有额外开辟空间去操作。
最后,操作完的数组的下标如下图所示:
每一趟把当前所处理序列的元素的最大值找出来,沉到当前处理的数据序列的最后一个位置,下一趟在处理的时候总是比上一趟少1个元素
每一趟都是少处理1个元素。
所以走size-1个趟数,因为最后一趟就剩下1个元素,所以就不用走最后一趟
冒泡排序的非优化代码实现
//冒泡排序算法
void BubbleSort(int arr[], int size)
{for (int i = 0; i < size-1; i++)//趟数 O(n) * O(n) = O(n^2){//一趟的处理 for (int j = 0; j < size - 1 - i; j++)//O(n)//size-1,是因为是j和j+1比较 {if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
冒泡排序的优化代码实现
如果我们在某一趟中,发现两两比较,整个序列比较完之后,并没有进行任何的数据交换,这说明这一趟检测出来,数据已经是从小到大排序好的了,例如上图中的第8趟,这时候根本没必要进行后面的趟了
//冒泡排序算法
void BubbleSort(int arr[], int size)
{for (int i = 0; i < size-1; i++)//趟数 O(n) * O(n) = O(n^2){bool flag = false;//一趟的处理 for (int j = 0; j < size - 1 - i; j++)//O(n)//size-1,是因为是j和j+1比较 {if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = true;}}if (!flag)//冒泡排序算法的优化之处 {//如果没有做任何的数据交换,那么说明数据已经有序了,就不用继续走后面的趟了 return;}}
}
冒泡排序的性能分析
因为冒泡排序都是在原数组上进行操作的,原地排序的,并没有额外开辟空间,所以空间复杂度是O(1)
因为冒泡实现有2个for循环,是嵌套的
所以冒泡排序的平均和最坏的时间复杂度是O(n^2)
最好的时间复杂度是O(n),因为最好的情况下,数据本身就是有序的,经过第一趟处理,没有做任何的交换,任何return掉,只做了内部的一趟的for循环操作。
稳定性:
稳定性就是:
有2个元素,元素1和元素2的值相同,在序列中,元素1排在元素2的前面,然后经过排序完成后,元素1还是在元素2的前面。
这个稳定性主要应用在map表中,或者有映射关联关系的集合中:
我们可以把左边的称为key,右边的称为value
当我们在最开始的原始位置中,放置数据的时候,我们按照键相同的时候,我们按照它们的字典顺序排序的,aaa在前面,bbb在后面
我们到时一筛选5,一筛选k,对应的value都是按照字典序排好的,aaa,bbb,ccc,ddd
如果我们现在有很多key,不仅有5,还有6,7,而且5有多个5,如果是稳定的排序的话,最后排好序后,5对应的aaa还是在5对应的bbb之前。
如果是不稳定的排序的话,会导致,原来上面的key,现在排序了以后,5对应的bbb跑到了aaa前面了。导致,当我们再去看key是5对应的value,这个value不是按照之前的字典顺序排列了,是乱的了。
冒泡排序是稳定的,因为只有上边元素大于其下边元素,才会交换,如果上边元素小于等于其下边元素,是不会进行交换操作的。
577-冒泡排序算法的思想和性能分析相关推荐
- 209-希尔排序算法的思想和性能分析
1.希尔排序算法的思想和性能分析 希尔排序可以认为是插入排序的一个优化,升级. 如果数据序列从大的方向,从全局看,已经是趋于有序的,那么插入排序是所有排序算法中效率最高的. 希尔排序就是从插入排序的这 ...
- 201-冒泡排序算法的思想和性能分析(时间、空间复杂度 稳定性)
1.冒泡排序 特点: 相邻元素两两比较,把值大的元素往下交换. 缺点: 数据交换的次数太多了. 2.冒泡排序算法的思想 上图是无序的数据,要进行排序. 冒泡排序就是: 每一趟都是从开始的这个元素,两两 ...
- 算法的时间复杂度和性能分析
算法的引入 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法! 我们可以不看兵法在战 ...
- 冒泡排序算法实现思想个人理解
一.冒泡排序算法个人理解 主要是以两个形成嵌套的for循环来完成的.外层的for循环以索引ix的值来逐个访问序列中的每个元素,ix的值由0开始增加到size(sequence) - 1,当外部的for ...
- 排序集锦(各种排序算法的特点及性能分析)
关于排序,似乎很简单的很常见的概念,却蕴含着很多技术,下面是从不同的角度,对排序的总结: 直插希 冒泡快 选择堆 1 按照排序特性分类 首先按照排序本身的操作特性可以分为下面几种: 插入排序 直接插入 ...
- c语言排序教学过程,C语言中冒泡排序算法教学设计
排序是计算机科学中一项重要的技术,其应用范围广.使用频率高,因此对于排序算法的研究一直是计算机专家的重点.高校的程序设计类课程也将排序算法作为重难点进行教学. 1常见的几种排序算法 1.1算法的基本概 ...
- 【数据结构与算法】冒泡排序算法(BubbleSort)
目录 1.缘起 2.BubbleSort 算法描述 3.用图示描述 BubbleSort 算法 4.C 语言描述 5.Python 语言描述 6.Java 语言描述 7.总结 1.缘起 冒泡排序算法 ...
- C语言案例教学设计论文,【教学设计论文】C语言中冒泡排序算法教学设计(共2525字)...
排序是计算机科学中一项重要的技术,其应用范围广.使用频率高,因此对于排序算法的研究一直是计算机专家的重点.高校的程序设计类课程也将排序算法作为重难点进行教学. 1常见的几种排序算法 1.1算法的基本概 ...
- 冒泡排序算法(Bubble Sort)
[冒泡排序算法基本思想和案例] 冒泡排序: 对比相邻的元素值,如果满足条件就交换元素值,把较小的元素移动到数组的前面,把大的元素移动到 数组的后面(也就是交换两个元素的位置),这样数组元素就像气泡一样 ...
最新文章
- Linux不停往外发包
- 根据ip地址获得天气预报
- 福禄克Fluke Pro3000 音频发生器和探头
- [ZJOI2007]矩阵游戏
- java面试题三_最全的java面试题目三
- Hbuilder MUI 下拉选择与时间选择器
- 深入理解javascript函数参数
- 真格量化-隐含波动率购买
- 中奖福利事宜 和 跪求意见
- oracle启动数据库错误
- 日志服务器文档,日志服务器的搭建.docx
- CF802C Heidi and Library (hard) (网络流+最大流)
- 转载:bat批处理简易教程
- 《.NET程序员面试秘籍》读书笔记
- react结合rust编写wasm图像处理
- 学习Transformer:自注意力与多头自注意力的原理及实现
- hadoop的两个推荐下载地址
- python---打包exe文件运行自动化
- 虚拟化系统(XenServer,ESXi)-XenServer
- 如何在HTML中引用jQuery函数库
热门文章
- 目标检测 | End-to-end Lane Detection through Differentiable Least-Squares Fitting
- Visio更改图形块的内边距
- EasyPark共享停车位的设计与实现
- 已知四点经纬度位置计算球面面积
- 虚拟内存与物理内存之间的关系
- memcached的安装和基本操作
- 论文阅读笔记:(2022) Delving into the Devils of Bird‘s-eye-view Perception: A Review, Evaluation and Recipe
- 鸿蒙内核源码分析系列 | 读懂HarmonyOS内核源代码!
- 安全资料,限时领取!
- 1555:计算双阶乘