1. 程式人生 > >數據結構與算法-----冒泡排序

數據結構與算法-----冒泡排序

images div 基本 問題 比較 style 都是 .com 總數

  冒泡排序的基本思想,就是相鄰的兩個數字進行比較,如果它們的順序錯誤,就把它們交換過來。什麽是順序錯誤呢?比如我們按從大到小進行排列,那麽應該是大的數在前面,小的數在後面,兩個數如果是45,98這麽排列,它們就是順序錯誤,我們就要把它們交換過來,變為45,98;

  現在我們就按照上面的基本思想,對5個數12, 35, 99, 8, 100進行降序排列。

    1, 首先比較第1個數和第2個數:12,35,由於是降序排列,越小的數應該越在後面, 而在這裏12 比35小,卻排在了前面, 不符合要求,就是順序錯誤,我們要把它們交換過來,經過交換之後,變成了 35, 12, 99, 8, 100;

    2, 現在再比較第2個數和第3個數: 12,99,由於12 還是小於99, 確排在前面,我們仍要調換它們的位置, 調換之後為35, 99, 12, 8, 100;

    3, 再比較第3個數和第4個數; 12, 8: 12 > 8 , 符合小的在後面的原則,不用調換位置。

    4, 最後比較第4個數和第5個數: 8 和100, 調換它們的位置 35, 99, 12, 100, 8;

  經過這4次比較,我們把最小的數字8找出來了,並放到了最後。但是僅僅找出了一個最小的數。我們還是需要進行排序,還是要按照上面的兩兩比較方法,

  現在再進行一次排序:

    1,比較第1個數和第2個數:35, 99, 由於35 < 99, 不符合越小的數越在後面的原則,所以交換它們的位置: 99, 35, 12, 100, 8;

    2, 比較第2個和第3個數:35,12; 可以看到,它們不用交換位置

    3, 比較第3個數和第4個數: 12, 100,需要交換它們的位置 99, 35, 100, 12, 8;

  註意,這裏就不用再去比較第4位和第5位數了,因為在上面的第一次比較中,8已經是最小的數了。

  這裏只經過3個比較,找出的第二小的數。

  接著進行排序, 還是要兩兩比較,找出第三小的數

    1, 比較第1個數和第2個數: 99,35, 不需要交換它們的位置。

    2, 再比較第2個數和第3個數: 35, 100, 需要交換它們的位置 99,100, 35,12,8

  經過2個比較,我們找出了第3小的數,35;

  還是需要進行一個比較,找出第4小的數字,

    只需要比較第1個數和第2個數, 99,100,交換它們的位置。100,99,35, 12, 8

  這裏只需要比較1次,就可以完成任務了。

  最終排序完成。100,99,35, 12, 8

  上面的排序過程,我們發現大的比較,一共發生了四次,每一次,我們稱之為一趟。而每一趟只確定一個數進行歸位。

  現在對上面的過程進行抽象一下: 我們一共5個數,共進行了4趟比較, 也就是說,如果我們有n個數, 我們要經歷n-1趟比較。現在再看每一趟中的內部比較。

    在第一趟中,我們經過了4次比較,在第二趟中,我們經過了3次比較,

    在第三趟中,我們經過了2次比較,在第四趟中,我們經過了1次比較

  可以發現 趟數 + 比較次數 = 總共的個數。我們確定了趟數i, 用總數n 減去趟數就可以了。

  現在就可以用程序寫一下。由於每次都是兩兩比較,所以我們要確定一個變量i, 比較完一次後,讓它自動加1,以便進行下次比較,這就是循環。當然我們還要確定多少個數字,以便確認比較多少次。長度加上循環, 用數組是最好不過的了。

function bubbleSort (arr) {
  let newArray = arr.slice();   // 函數式編程的思想,不要對外部的變量進行改變。
  let n = newArray.length;      // 數組的長度,從而確定比較多少趟
   // 冒泡排序核心,首先要比較n- 1趟,因為每一趟只能確定一個數字
   for(let i = 0; i< n -1; i++) {
        for(let j =0; j< n - i; j++) {// 每一趟內部進行兩兩比較,而比較的次數就是 n -i 

            // 如果順序錯誤,就交換它們的位置
             if(newArray[j] < newArray[j + 1]) {
                 let temp = newArray[j];
                 newArray[j] = newArray[j+1];
                 newArray[j+1] = temp;
             }
     }
  }
  return newArray;
}

  把 我們上面排序的5個數放入數組中,然後傳入到bubbleSort 函數中

  let array = [12, 35, 99, 8, 100];
 console.log("排序前的數組:" + array);
 console.log("排序後的數組:" +bubbleSort(array));

   結果如下,排序沒有問題

技術分享

數據結構與算法-----冒泡排序