動畫:如何給面試官寫一個滿意的冒泡排序

在這裏插入圖片描述

寫在前邊

對於冒泡排序,不少小夥伴已經能夠說很熟悉了,順手就能夠寫出來,但對於一個初學者來講,小鹿想經過這篇文章,讓你一次性就理解冒泡排序以及冒泡排序的優化,就不用去翻看其餘文章了。前端

記得以前一個讀者和小鹿說去面試的時候,面試官讓寫一個冒泡排序,也寫出來了,最後去沒有經過面試。其實他的冒泡排序沒有進行優化的,這也不是重點。面試

在學數據結構和算法我有一個重大的發現,也包括我本身前期剛接觸數據結構,對於一些排序算法都是去背加理解,可是這個理解呢,若是沒有很深入的理解,在手寫代碼的時候容易亂,因此呢,要想快速、正確、給面試官一個滿意的冒泡排序,就跟着小鹿學起來吧。算法


一、什麼是冒泡排序?

冒泡排序,顧名思義,那就是冒泡唄。咱們最早想到的是魚在水裏的冒泡的過程。「沒見過魚!」,好吧,那就讓你見識一下魚吐泡泡,哈哈!編程

在這裏插入圖片描述
咱們能夠在圖中能夠發現,魚吐的泡泡離水面越近,他的泡泡就會越大,其實咱們的冒泡排序和魚吐泡泡的原理是如出一轍子的。


二、設計一個冒泡排序

若是你是設計冒泡排序的人,你打算怎麼根據魚吐泡泡的原理去設計呢?那今天咱們就假設本身是設計冒泡排序的人,如何設計一個冒泡排序?數組

咱們在魚吐泡泡中發現的規律是,每次冒泡最大的會在最上邊(離進水面),因此咱們也要使得一組數據的最大值放在最上方。所給的原始數據以下: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前端領域、數據結構與算法、網絡原理等通俗易懂的呈獻給小夥伴。。公衆號回覆 「資料」 送一從零自學資料大禮包!

【轉載說明】:轉載請說明出處,謝謝合做!~

相關文章
相關標籤/搜索