动画:如何给面试官写一个满意的冒泡排序

在这里插入图片描述

写在前边

对于冒泡排序,不少小伙伴已经能够说很熟悉了,顺手就能够写出来,但对于一个初学者来讲,小鹿想经过这篇文章,让你一次性就理解冒泡排序以及冒泡排序的优化,就不用去翻看其余文章了。前端

记得以前一个读者和小鹿说去面试的时候,面试官让写一个冒泡排序,也写出来了,最后去没有经过面试。其实他的冒泡排序没有进行优化的,这也不是重点。面试

在学数据结构和算法我有一个重大的发现,也包括我本身前期刚接触数据结构,对于一些排序算法都是去背加理解,可是这个理解呢,若是没有很深入的理解,在手写代码的时候容易乱,因此呢,要想快速、正确、给面试官一个满意的冒泡排序,就跟着小鹿学起来吧。算法


一、什么是冒泡排序?

冒泡排序,顾名思义,那就是冒泡呗。咱们最早想到的是鱼在水里的冒泡的过程。“没见过鱼!”,好吧,那就让你见识一下鱼吐泡泡,哈哈!编程

在这里插入图片描述
咱们能够在图中能够发现,鱼吐的泡泡离水面越近,他的泡泡就会越大,其实咱们的冒泡排序和鱼吐泡泡的原理是如出一辙子的。


二、设计一个冒泡排序

若是你是设计冒泡排序的人,你打算怎么根据鱼吐泡泡的原理去设计呢?那今天咱们就假设本身是设计冒泡排序的人,如何设计一个冒泡排序?数组

咱们在鱼吐泡泡中发现的规律是,每次冒泡最大的会在最上边(离进水面),因此咱们也要使得一组数据的最大值放在最上方。所给的原始数据以下:bash

在这里插入图片描述

为了咱们好理解,咱们把数组竖起来。网络

在这里插入图片描述

基本的目标咱们确认了,就是让最大的数字放在数组的最尾部(咱们能够想象把数组立起来,尾部在上,数组头部在下)。既然最大的放在上边,那怎么在一组数据中寻找最大值,而后放到最顶端。上边的数据就会变成下边这个样子(8位于最上边):数据结构

在这里插入图片描述

若是咱们从底部开始,前两个数据做对比,若是上边的数据大于下边的数据,就用这个上边的数字去和它上边的数字比较大小。若是下边的数字大于上边的数字,那咱们就将这两个数字交换位置。以此类推,这样一组下来以后,这组数据的最大值就跑到了最上方(数组尾部),这个过程是怎么样子的呢?以下动画:数据结构和算法

在这里插入图片描述

闪烁表明比较,放大为两个数最大值性能

每寻找一次最大值,就要从剩余的数据中寻找最大值依次放置到顶部。

咱们看到上方的一组冒泡下来以后,8位于最上方了,而后将剩余的数据再进行冒泡,一样的冒泡过程。

假设 n 个数据,当冒泡 n - 1 次以后,全部的数据就已经排序完成了。


三、冒泡排序优化

咱们会发现咱们设计的冒泡排序中存在一个问题就是,若是这组数据已是排好序的,若是咱们还在上边所说的同样,每一个数据都要进行一次冒泡,此时的性能效率会很是低下,因此咱们对设计的冒泡排序进行一次优化。

如何优化呢?咱们能够加一个判断,若是咱们第一组数据冒泡的过程当中没有数据交换,此时数据已是有序的了,而后直接返回在这组数据就能够了,不必再向下继续冒泡。


四、手写冒泡排序

1/**
 2 * 时间:2019/3/14 
 3 * 功能:冒泡排序
 4 * @param a:数组
 5 * @param n:数组的大小
 6 * 边界条件:
 7 * 1) 判断数组是否有数据
 8 * 算法思路:
 9 * 1)外循环 for 须要 n 个数据 n 次冒泡
10 * 2)内循环每次冒泡的比较次数,每冒泡比较次数都 -1
11 * 3)冒泡优化
12 */
13var flag = false;
14const bubblesort = (a) =>{
15    if(a.length < 1) return;
16    for(let i = 0;i < a.length;i++){
17        for(let j = 0;j < a.length-1-i;j++){
18            if(a[j]>=a[j+1]){
19                let temp = a[j];
20                a[j] = a[j+1];
21                a[j+1] = temp;
22                flag = true;
23            }
24        }
25        if(!flag){
26            break;
27        }
28    }
29}
复制代码

五、冒泡排序性能

对于冒泡排序的性能的话,分析性能我么你主要从两方面入手,第一个是时间复杂度,另外一个是空间复杂度。

5.1 时间复杂度

在时间复杂度上,咱们看效率,咱们若是一次数据查找最大值的过程是须要交换 n - 1 次, n 个数据,须要进行 n - 1 次冒泡过程。因此时间复杂度为 (n-1)² = n² - 2n + 1 ,省略掉系数和低阶,因此时间复杂度为 O(n²)。

咱们还有一种状况就是数据已是排好序了,因此冒泡一次就能够了,时间复杂度是 O(n)。这是最好时间复杂度,可是总的来讲,这种状况很是少,因此呢,冒泡排序的时间平均时间复杂度为 O(n²)。

5.2 空间复杂度

空间复杂度咱们重点看什么?空间复杂度咱们主要看额外利用的空间,好比咱们在冒泡的过程当中,涉及到数据交换,交换时须要申请临时的空间,它是常量级别的,其余不需开辟要额外的内存空间,因此空间复杂度为 O(1)。


六、小结

今天咱们主要分享了冒泡排序,它是什么,并且咱们经过鱼吐泡泡的原理,本身设计了一下冒泡排序,加深了对冒泡排序的整个过程的理解。而后咱们也分解了手写冒牌排序的过程,还有冒泡的优化,让咱们在面试中给面试官一个满意的冒泡排序。

一般在面试中,冒泡排序最主要的是不但写出主要过程,还要考虑到冒泡排序的优化过程,不少的应聘者每每会忽略这一点,你必定不要忘记哦!


❤️ 不要忘记留下你学习的脚印 [点赞 + 收藏 + 评论]

一切看文章不点赞都是“耍流氓”,嘿嘿ヾ(◍°∇°◍)ノ゙!开个玩笑,动一动你的小手,点赞就完事了,你每一个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!很是感谢! ̄ω ̄=


做者Info:

【做者】:小鹿

【原创公众号】:小鹿动画学编程。

【简介】:和小鹿同窗一块儿用动画的方式从零基础学编程,将Web前端领域、数据结构与算法、网络原理等通俗易懂的呈献给小伙伴。。公众号回复 “资料” 送一从零自学资料大礼包!

【转载说明】:转载请说明出处,谢谢合做!~

相关文章
相关标签/搜索