天天看點

巨詳細的“冒泡排序”

  冒泡排序的文章一搜很多很多,但是我看了好多的文章基本就是簡單的貼上了自己的程式,簡單了就說了需要兩層for循環具體的為啥需要兩層,不曾細說,今天小編檢視了教材上的一個相關例子,算是具體詳細了解這兩層循環具體是個神麼鬼:

      舉栗子:數組[9,7,5,4,3,2];看圖寫話:

  :

巨詳細的“冒泡排序”
  上面模拟了一個"冒泡的過程",把最大的數擠到了最底下,而小數"上升",這樣看起來有了“這種冒泡的樣子”,相鄰兩個數比較,把大的往前挪。這是第一趟比較,把最大得數壓到了最下面,留意下下這裡的比較次數,六個數比較了5次,讓最大的數到底,那麼第二趟又是怎樣的情況呢?看圖:
巨詳細的“冒泡排序”

     (明顯看出來這個圖比上個圖好看多了,也不改動上面的圖了,算是一個進步的過程展現吧)

  第一趟的比較,最大數9 已經到了最下面,第二趟的比較就是把第二大的數7擠到最下面,如圖,7下來了。這次比較的是4次。。。好了,我們來推算一下

  兩個數,兩兩比較,我們隻需要比較一趟,就可以大小排列,三個數我們需要兩趟;四個數我們需要3趟;六個數需要5趟;按上面的畫法,我們畫5張圖就完成任務了;n個數就比較了(n-1)趟;每一趟中比較了幾次呢?上圖,第一趟比較了5次,第二次比較了4次。。。那麼第j趟就比較了第(n-j)次;好了,理清楚了:

  n個數比較了 n-1 趟,在每一趟中比較了 n-1-i次;i表示趟,j表示每趟的次數

下面就是代碼實作了:

  

var array = [9,7,5,4, 3, 2];
var temp = 0;
for (var i = 0; i < array.length-1; i++){
    for (var j = 0; j < array.length-1-i; j++){
        if (array[j] > array[j + 1]){
            temp = array[j + 1];
            array[j + 1] = array[j];
            array[j] = temp;
        }
    }
}
console.log(array);//[2,3,4,5,7,9]      

外層比較的時候趟數,内層是比較的是次數;   

兩個數比較大小的的話就是這樣的套路(這裡就說這麼一個): 

巨詳細的“冒泡排序”

    看圖了解吧! temp = b;b =a; a = temp;

運作結果這樣的:

巨詳細的“冒泡排序”

    看官,看明白沒?連寫帶畫圖寫了一個小時,如果有不足或者錯誤之處,敬請批評!

     每日一句:Combine open-source packages with your private code and publish to a private registry behind the firewall.(npm的子產品介紹中)

     翻譯:将開源包與私有代碼相結合,并将其釋出到防火牆後面的私有系統資料庫中。

繼續閱讀