看动画和视频学习冒泡排序

Posted Java3y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看动画和视频学习冒泡排序相关的知识,希望对你有一定的参考价值。


本文公众号来源:算法无遗策
作者:zoukeqing
本文已收录至我的 GitHub

冒泡排序

 

看动画和视频学习冒泡排序

 

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

 

 

排序方法

 

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

 

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

 

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

 

看动画和视频学习冒泡排序



示例

 

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

 

初始状态

 

看动画和视频学习冒泡排序

 

视频动画

 


Code

 

看动画和视频学习冒泡排序

 

Result

 

初始状态[5, 6, 1, 7, 2, 4, 3]

发生交换[5, 1, 6, 7, 2, 4, 3]

发生交换[5, 1, 6, 2, 7, 4, 3]

发生交换[5, 1, 6, 2, 4, 7, 3]

发生交换[5, 1, 6, 2, 4, 3, 7]

1次遍历:[5, 1, 6, 2, 4, 3, 7]

发生交换[1, 5, 6, 2, 4, 3, 7]

发生交换[1, 5, 2, 6, 4, 3, 7]

发生交换[1, 5, 2, 4, 6, 3, 7]

发生交换[1, 5, 2, 4, 3, 6, 7]

2次遍历:[1, 5, 2, 4, 3, 6, 7]

发生交换[1, 2, 5, 4, 3, 6, 7]

发生交换[1, 2, 4, 5, 3, 6, 7]

发生交换[1, 2, 4, 3, 5, 6, 7]

3次遍历:[1, 2, 4, 3, 5, 6, 7]

发生交换[1, 2, 3, 4, 5, 6, 7]

4次遍历:[1, 2, 3, 4, 5, 6, 7]

5次遍历:[1, 2, 3, 4, 5, 6, 7]

6次遍历:[1, 2, 3, 4, 5, 6, 7]

 

优化

 

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

 

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

 

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

 

Code

 

看动画和视频学习冒泡排序

 

Result

 

初始状态[5, 6, 1, 7, 2, 4, 3]

发生交换[5, 1, 6, 7, 2, 4, 3]

发生交换[5, 1, 6, 2, 7, 4, 3]

发生交换[5, 1, 6, 2, 4, 7, 3]

发生交换[5, 1, 6, 2, 4, 3, 7]

1次遍历:[5, 1, 6, 2, 4, 3, 7]

发生交换[1, 5, 6, 2, 4, 3, 7]

发生交换[1, 5, 2, 6, 4, 3, 7]

发生交换[1, 5, 2, 4, 6, 3, 7]

发生交换[1, 5, 2, 4, 3, 6, 7]

2次遍历:[1, 5, 2, 4, 3, 6, 7]

发生交换[1, 2, 5, 4, 3, 6, 7]

发生交换[1, 2, 4, 5, 3, 6, 7]

发生交换[1, 2, 4, 3, 5, 6, 7]

3次遍历:[1, 2, 4, 3, 5, 6, 7]

发生交换[1, 2, 3, 4, 5, 6, 7]

4次遍历:[1, 2, 3, 4, 5, 6, 7]

 

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

 

优化,还能再继续优化

 

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

 

Code

 

看动画和视频学习冒泡排序

 

Result

 

看动画和视频学习冒泡排序

 

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

 

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

 

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

 

视频动画

 


Code

 

看动画和视频学习冒泡排序

 

Result

 

看动画和视频学习冒泡排序

 


——END——


欢迎加入 交流群 学习,备注 加群
说实话在这个群,哪怕您不说话,光看聊天记录,都能学到东西看动画和视频学习冒泡排序

看动画和视频学习冒泡排序


推荐阿里云推广服务器89/年,229/3年,买来送自己,送女朋友马上过年再合适不过了,买了搭建个项目给面试官看也香,还可以熟悉技术栈,(老用户用家人账号买就好了,我用我女朋友的

以上是关于看动画和视频学习冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

视频动画 | 冒泡排序只是简单的冒泡排序吗?

视频动画 | 什么是快速排序?

视频动画 | 什么是快速排序?

视频动画 | 什么是鸡尾酒排序?

排序算法视频版 | 冒泡排序

排序算法精讲:选择排序和冒泡排序