對於冒泡排序,不少小夥伴已經能夠說很熟悉了,順手就能夠寫出來,但對於一個初學者來講,小鹿想經過這篇文章,讓你一次性就理解冒泡排序以及冒泡排序的優化,就不用去翻看其餘文章了。前端
記得以前一個讀者和小鹿說去面試的時候,面試官讓寫一個冒泡排序,也寫出來了,最後去沒有經過面試。其實他的冒泡排序沒有進行優化的,這也不是重點。面試
在學數據結構和算法我有一個重大的發現,也包括我本身前期剛接觸數據結構,對於一些排序算法都是去背加理解,可是這個理解呢,若是沒有很深入的理解,在手寫代碼的時候容易亂,因此呢,要想快速、正確、給面試官一個滿意的冒泡排序,就跟着小鹿學起來吧。算法
冒泡排序,顧名思義,那就是冒泡唄。咱們最早想到的是魚在水裏的冒泡的過程。「沒見過魚!」,好吧,那就讓你見識一下魚吐泡泡,哈哈!編程
咱們能夠在圖中能夠發現,魚吐的泡泡離水面越近,他的泡泡就會越大,其實咱們的冒泡排序和魚吐泡泡的原理是如出一轍子的。若是你是設計冒泡排序的人,你打算怎麼根據魚吐泡泡的原理去設計呢?那今天咱們就假設本身是設計冒泡排序的人,如何設計一個冒泡排序?數組
咱們在魚吐泡泡中發現的規律是,每次冒泡最大的會在最上邊(離進水面),因此咱們也要使得一組數據的最大值放在最上方。所給的原始數據以下: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前端領域、數據結構與算法、網絡原理等通俗易懂的呈獻給小夥伴。。公衆號回覆 「資料」 送一從零自學資料大禮包!
【轉載說明】:轉載請說明出處,謝謝合做!~