演算法與資料結構系列 ( 六 ) - 氣泡排序法- Bubble Sort

Tim-AutumnWind發表於2020-05-25

前言

本章我們繼續學習另外一個排序演算法 氣泡排序
氣泡排序 應該算是我們搬磚接觸的第一個演算法了吧
氣泡排序 其實非常簡單, 在本章將會一如既往的向大家展示其思路和程式碼實現流程。
相對於 插入排序氣泡排序在某些的情況下,可能效能有些不理想

舉個生活栗子

我們還是在打 撲克牌 的時候,我們整理牌的思想,差不多也可以是 氣泡排序 的思想
比如:左邊最小,右邊最大。
選擇排序 是找到最小數,然後進行排序,對比插入,然後整理 撲克牌
但是有的小夥伴,喜歡先把大的牌,插入到右邊
那如何識別出最大的牌,這就是對比中的 氣泡排序 思想
然後將最大的牌冒泡到最右邊 (最左邊也行)
直到我們將手上的牌整理完畢,這就是類似的 氣泡排序 思想

氣泡排序,先簡單瞭解一下思路

  • 首先我們有這麼一段資料,我們需要將他們重新整合有序
    | 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第一小輪排序
  • 我們會將資料進行一次迴圈對比,這個過程有點類似於 選擇排序
  • 但是和選擇排序不同的是,我們是將資料進行一個一個的對比
    | 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
  • 拿到座標 01 的資料資訊,也就是 72 進行對比
    72 大,進行位置交換,將 2 放到 7 的前面
  • 經過此次交換後,得到以下資料
    | 2 | 7 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第二小輪排序
  • 這也是 氣泡排序 的特點
  • 拿到座標 12 的資料資訊,也就是 71 進行對比
    71 大,進行位置交換,將 1 放到 7 的前面
  • 經過此次交換後,得到以下資料
    | 2 | 1 | 7 | 5 | 4 | 6 | 9 | 3 | 8 |
第三小輪排序
  • 拿到座標 23 的資料資訊,也就是 75 進行對比
    75 大,進行位置交換,將 5 放到 7 的前面
  • 經過此次交換後,得到以下資料
    | 2 | 1 | 5 | 7 | 4 | 6 | 9 | 3 | 8 |
第四小輪排序
  • 拿到座標 34 的資料資訊,也就是 74 進行對比
    74 大,進行位置交換,將 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 協議》,轉載必須註明作者和本文連結

相關文章