前言
本章我們繼續學習另外一個排序演算法 氣泡排序
氣泡排序
應該算是我們搬磚接觸的第一個演算法了吧氣泡排序
其實非常簡單, 在本章將會一如既往的向大家展示其思路和程式碼實現流程。
相對於 插入排序
,氣泡排序
在某些的情況下,可能效能有些不理想
舉個生活栗子
我們還是在打 撲克牌
的時候,我們整理牌的思想,差不多也可以是 氣泡排序
的思想
比如:左邊最小,右邊最大。選擇排序
是找到最小數,然後進行排序,對比插入,然後整理 撲克牌
但是有的小夥伴,喜歡先把大的牌,插入到右邊
那如何識別出最大的牌,這就是對比中的 氣泡排序
思想
然後將最大的牌冒泡到最右邊 (最左邊也行)
直到我們將手上的牌整理完畢,這就是類似的 氣泡排序
思想
氣泡排序,先簡單瞭解一下思路
- 首先我們有這麼一段資料,我們需要將他們重新整合有序
| 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第一小輪排序
- 我們會將資料進行一次迴圈對比,這個過程有點類似於
選擇排序
- 但是和選擇排序不同的是,我們是將資料進行一個一個的對比
| 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 | - 拿到座標
0
和1
的資料資訊,也就是7
和2
進行對比7
比2
大,進行位置交換,將2
放到7
的前面 - 經過此次交換後,得到以下資料
|2
|7
| 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第二小輪排序
- 這也是
氣泡排序
的特點 - 拿到座標
1
和2
的資料資訊,也就是7
和1
進行對比7
比1
大,進行位置交換,將1
放到7
的前面 - 經過此次交換後,得到以下資料
| 2 |1
|7
| 5 | 4 | 6 | 9 | 3 | 8 |
第三小輪排序
- 拿到座標
2
和3
的資料資訊,也就是7
和5
進行對比7
比5
大,進行位置交換,將5
放到7
的前面 - 經過此次交換後,得到以下資料
| 2 | 1 |5
|7
| 4 | 6 | 9 | 3 | 8 |
第四小輪排序
- 拿到座標
3
和4
的資料資訊,也就是7
和4
進行對比7
比4
大,進行位置交換,將4
放到7
的前面 - 經過此次交換後,得到以下資料
| 2 | 1 | 5 |4
|7
| 6 | 9 | 3 | 8 |
依次類推 第一大輪結束後
- 你會得到這樣的資料
| 2 | 1 | 5 | 4 | 6 | 7 | 3 | 8 | 9 | - 大家發現一個問題,在
選擇排序
當中,我們是最小排序最小數 - 然而在
氣泡排序
當中,我們是先完成最大數的排序,將最大數冒泡到資料頂端
然後再持續的以此類推
- 完成
總大小 - 1 輪
後,我們會得到以下資料
| 1 | 2 | 4 | 5 | 6 | 3 | 7 | 8 | 9 | - 完成
總大小 - 2 輪
後,我們會得到以下資料
| 1 | 2 | 4 | 5 | 3 | 6 | 7 | 8 | 9 | - 完成
總大小 - 3 輪
後,我們會得到以下資料
| 1 | 2 | 4 | 3 | 5 | 6 | 7 | 8 | 9 | - 完成
總大小 - 4 輪
後,我們會得到以下資料
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | - 貌似我們按照肉眼觀看,此時資料以及完整有序了
- 但是
總輪數
還在繼續,雖然有點雞肋了哈 - 但他已經排序成功了,至於
氣泡排序
的優化,這個我就不說了 - 反正這文章有沒有人看都不知道,而且
氣泡排序
有點糟糕的效能,估計也沒幾個人願意用
TimAutumnWind (轉載請註明出處 learnku.com/users/48310)
實現一下程式碼 - for
- 時間和效能記錄,可以參照章節三中的
選擇排序
- 以後會直接實現程式碼
/** * 氣泡排序操作方法 - for * @param $sort * @param $n * @return mixed */ function get_bubble_sort_for($sort,$n){ /** 大輪迴圈 */ for ($i = 0; $i < $n ; $i++) { /** * 小輪迴圈 * 忍不住的修改一下,讓其已經有序的資料不再比較 * 原 for ($j = 0; $j < $n ; $j++) * 改 for ($j = 0; $j < $n - $i - 1; $j++) */ for ($j = 0; $j < $n ; $j++) { /** * 獲取 `當前座標值資料` and `當前座標 + 1資料` * 然後進行對比 * 如果 `當前座標值` 大於 `當前座標 + 1` 則進行交換 */ if ($sort[$j] > $sort[$j + 1]) { $val = $sort[$j + 1]; $sort[$j + 1] = $sort[$j]; $sort[$j] = $val; } } } return $sort; }
實現一下程式碼 - while
- 時間和效能記錄,可以參照章節三中的
選擇排序
- 以後會直接實現程式碼
/** * 氣泡排序操作方法 - while * @param $sort * @param $n * @return mixed */ function get_bubble_sort_while($sort,$n){ $i = 0; /** 大輪迴圈 */ while ( $i < $n ) { $j=0; /** * 小輪迴圈 * 忍不住的修改一下,讓其已經有序的資料不再比較 * 原 while ( $j < $n) * 改 while ( $j < $n - $i - 1 ) */ while ( $j < $n - $i - 1 ) { if ($sort[$j] > $sort[$j + 1]) { $val = $sort[$j + 1]; $sort[$j + 1] = $sort[$j]; $sort[$j] = $val; } $j++; } $i++; } return $sort; }
本作品採用《CC 協議》,轉載必須註明作者和本文連結
TimAutumnWind (轉載請註明出處 https://learnku.com/articles/39442)