[排序演算法]Bubble Sort — 氣泡排序法
bubble sort 的概念就是像泡泡一樣 ,越大的數字會漸漸的往右邊浮
比較相鄰的元素 ,兩兩比大小, 如果前面的數字大於後面的數字就交換順序,一路把最大值往後塞。
- 跑完第 1 回合,該陣列的最後一個數字就會是最大的
- 跑完第 2 回合,該陣列的倒數第 2 個數字就會是第 2 大的
- 規律為執行完第 n 回合,第 n 大的數字就會出現在倒數第 n 個位置
函式內部實作為:
假設現在有一個陣列[29, 10, 14, 37, 14]
要用氣泡排序法來排序的話
- 29 與 10 相比 29 較大,所以 29 與 10 交換,此時 arr =
[10, 29, 14, 37, 14]
- 29 與 14 相比 29 較大,所以 29 與 14 交換, 此時 arr =
[10, 14, 29, 37, 14]
- 29 與 37 相比 29 較小,所以 29 不跟 37 交換, 此時 arr =
[10, 14, 29, 37, 14]
- 37 與 14 相比 37 較大,所以 37 與 14 交換, 此時 arr =
[10, 14, 29,14, 37]
此時第一回合結束,可以發現最大的數字已經移動到最後面,依序執行 n-1 回合之後,就可以將全部的數字由小排到大了。
為甚麼是 n-1 回合? 假如今天有個陣列長度為 5,當 index1 ~index4 都是排序好的,那麼 index0 自然也會是最小的,就不需要再跑一次回合,所以只要跑 (n-1),5–1=4 回合即可。
連續的步驟會如下圖所示
用 js 實作氣泡排序法
1 | const bubble = (arr) => { |
第一個迴圈的長度為 arr.length-1,因為經過一輪的排列,直到最後一回合,剩下的那個值必定為最小值,就不需要比較,可以扣掉一次,那第二個迴圈的長度為甚麼是 arr.length-i-1 ?因為經過 i 回合後,倒數第 i 個數字都是經過排序的,那麼在跑迴圈的時候就可以排除掉,不需要檢查了。
時間複雜度
👍 在最差的情況下,時間複雜度是 O(n²)
👎 在最佳的情況下,時間複雜度是 O(n)
🤚 在平均情況下,時間複雜度為 O(n²)