演算法與資料結構系列 ( 四 ) - 插入排序法- Insert Sort

Tim-AutumnWind發表於2020-05-05

前言

本章我們繼續學習另外一個排序演算法 插入排序
插入排序 也算是我們 O(n^2) 的經典排序演算法之一
插入排序 其實非常簡單, 在我們日常當中也是常見的一種思想,可能相對而言大家並沒有歸類總結。所以可能大家使用過,但是並不知曉。

舉個生活栗子

我們在打 撲克牌 的時候,我們整理牌的思想,差不多就是 插入排序 的思想。
換句話說,就是把牌插入到相對合適的位置。當我們把手上所有的牌插入到指定位置,我們的牌就插入完成了

插入排序,先簡單瞭解一下思路

  • 首先我們有這麼一段資料,我們需要將他們重新整合有序
    | 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第一次排序
  • 用插入排序的思路就是先找到拿到數字座標 0 也就是 7
  • 但是和選擇排序不同的時候,此時我們並不會去移動 7
    | 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第二次排序
  • 接下來我們繼續對數字座標 1 的數字,和前面的數字進行一個對比
  • 顯然 27 小,我們就將 2 放在 7 的前面
  • 此時| 2 | 7 |已然排序完成
    | 2 | 7 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第三次排序
  • 接下來我們繼續對數字座標 2 的數字,和前面的數字進行一個對比
  • 顯然 17小,我們就將 1 放在 7 的前面
  • 然後再拿 12 對比,12 小,我們就將 1 放在 7 的前面
  • 此時 | 1 | 2 | 7 | 已然排序完成
    | 1 | 2 | 7 | 5 | 4 | 6 | 9 | 3 | 8 |
第四次排序
  • 接下來我們繼續對數字座標 3 的數字,和前面的數字進行一個對比
  • 顯然 57小,我們就將 5 放在 7 的前面
  • 然後再拿 52 對比,52 大,我們就將 5 原定不動
  • 此時| 1 | 2 | 5 | 7 |已然排序完成
    | 1 | 2 | 5 | 7 | 4 | 6 | 9 | 3 | 8 |

TimAutumnWind (轉載請註明出處 learnku.com/users/48310

此後一直以此類推,直至到底

實現一下程式碼 - for

  • 時間和效能記錄,可以參照上一章節中的 選擇排序
  • 以後會直接實現程式碼
    /**
    * 插入排序操作方法  - for
    * @param $sort
    * @param $n
    * @return mixed
    */
    function get_insertion_sort_for($sort,$n){
      /** 將資料迴圈一次 */
      for ($i = 0; $i < $n; $i++ ){
          /** 將前面資料進行迴圈 */
          for($j = $i;$j > 0; $j--){
              /** 如果當前數字小於前面數字,則為 true */
              if($sort[$j] < $sort[$j - 1]){
                  /** 
                   *  如果當前數字小於前面數字,則進行位置交換
                   *  php 沒有位置交換的函式,所以簡單一點,先取出,再覆蓋
                   */
                  $val = $sort[$j];
                  $sort[$j] = $sort[$j - 1];
                  $sort[$j - 1] = $val;
              }else{
                  /** 如果大於前面數字,則跳出,不進行位置交換 */
                  break;
              }
          }
      }
      return $sort;
    }

實現一下程式碼 - for

  • tips: 在 php 當中,while 要比 for 快一丟丟
    /**
    * 插入排序操作方法 - while
    * @param $sort
    * @param $n
    * @return mixed
    */
    function get_insertion_sort_while($sort,$n){
      $i = 0;
      while ( $i < $n ){
          $j = $i;
          while($j > 0){
              if($sort[$j] < $sort[$j - 1]){
                  $val = $sort[$j];
                  $sort[$j] = $sort[$j - 1];
                  $sort[$j - 1] = $val;
              }else{
                  break;
              }
              $j--;
          }
          $i++;
      }
      return $sort;
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章