冒泡排序 | 算法必看系列十一

简介: 冒泡排序算法的过程是两个元素比较的大小,是典型的交换排序算法。

原文链接
冒泡排序
640.png
冒泡排序算法时间复杂度最坏的情况是,最好的,说明冒泡排序是可以优化的,就看你有没有去发现。

冒泡排序算法的过程是两个元素比较的大小,是典型的交换排序算法。快速排序算法和鸡尾酒排序算法也属于交换排序。

排序方法

比较相邻的元素,判断是否符合要求,如果不符合就交换位置来达到排序的目的。

对每一对相邻元素做相同的工作,从开始第一对到结尾的最后一对,一次遍历之后,最后一个元素是最大(小)的数。

第二次遍历重复以上操作,因为最后一个元素已经确定位置,减少一次计算。以此类推。

640.gif
示例

通过一个示例来理解基本的冒泡排序算法,假设当前我们有一个数组a,里面元素是:5,6,1,7,2,4,3

初始状态
image.png
视频动画

Code
image.png
Result
image.png
优化

可以发现,我们到第4次遍历的时候,发现已经排序完了,但是代码还是会继续判断是否符合要求。

仔细看看,第4次遍历之前还有一次元数位置交换,第5次遍历之前已经没有了交换。

所以我们可以设置一个标志位,用来表示当前i+1次是否还有交换,如果有就进行下一趟遍历,如果没有,则说明当前数组已经排完序,没有再进行比较的判断了。

Code
image.png
Result
image.png

好了这是第一次的优化,减少了计算次数。看上面的执行过程,你觉得还有什么办法使得时间复杂度尽可能少一点呢?

优化,还能再继续优化

我觉得还能再继续优化,为了更直白一点,这次我们换一个数组,数组元素为:4, 3, 2, 1, 5, 6, 7

Code

image.png

Result

image.png
看到上面的结果可以看出一个问题,里面的for循环明明已经归位了,又增加了不必要的计算次数。问题是在于j

我们可以这样解决,进行第1次遍历之前,记录交换元素的最后一个位置lastPostion。交换后的元素后一个肯定要比前面一个元素大,lastPostion就记录前面一个元素就可以了。

进行一次遍历之后,lastPostion的记录有了,里面的for循环进行下标0到lastPostion的数组就可以了,lastPostion后面的一串数组由于前面第一次循环验证过了,没有任何交换的元素,说明也是排好序的。

视频动画

Code

image.png

Result

image.png

------End------

来源 | 算法无遗策
作者 | 我脱下短袖

相关文章
|
23天前
|
搜索推荐
冒泡排序算法
【10月更文挑战第19天】冒泡排序是一种基础的排序算法,虽然在实际应用中可能不是最优的选择,但对于理解排序算法的基本原理和过程具有重要意义。
|
1月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
17 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
1月前
|
搜索推荐 算法 数据可视化
深入解析冒泡排序算法
深入解析冒泡排序算法
31 4
|
1月前
|
搜索推荐 C语言
排序算法--冒泡排序
排序算法--冒泡排序
13 0
|
1月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
1月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
3月前
|
搜索推荐 Java
经典排序算法---冒泡排序
这篇文章详细介绍了冒泡排序算法的基本思想、比较轮数和次数,并提供了Java语言实现冒泡排序的代码示例,展示了如何通过相邻元素的比较和交换来达到排序的目的。
经典排序算法---冒泡排序
|
4月前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
33 1
|
5月前
|
搜索推荐 算法 大数据
​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
|
5月前
|
机器学习/深度学习 搜索推荐 算法
【C/排序算法】:快速排序和冒泡排序
【C/排序算法】:快速排序和冒泡排序
38 0