數據結構與算法-----冒泡排序
冒泡排序的基本思想,就是相鄰的兩個數字進行比較,如果它們的順序錯誤,就把它們交換過來。什麽是順序錯誤呢?比如我們按從大到小進行排列,那麽應該是大的數在前面,小的數在後面,兩個數如果是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));
結果如下,排序沒有問題
數據結構與算法-----冒泡排序