算法與數據結構系列 ( 三 ) - 選擇排序法 - Select Sort

前言

首先咱們玩的是比較經典的選擇排序
選擇排序也是咱們本系列的第一個  O(n^2) 算法
不少人認爲最優的算法是  O(n log n) 級別的算法

這樣就衍生出了一個問題

 

爲何要學習 O(n^2) 級別的算法?

基礎:

O(n^2) 相對而言比較基礎,由簡入難。不少時候咱們作項目,或者是作其餘業務的時候。咱們可能找不到最優的解決辦法,可是咱們確定會一種最簡單的辦法。咱們先將功能實現,再進行優化。可能相對而言,會有一些性能上面的問題。可是隨着咱們慢慢優化,咱們也會慢慢找到新的,更優秀的方式php

容易實現:

有些狀況下,咱們借用算法的思想去作項目的時候。由於自己達不到 O(n log n) 級別,那麼這個時候,咱們能夠選擇相對簡單,和容易實現的級別。如: O(n^2)node

簡單有效:

某些特殊狀況下,簡潔有效算法

由簡入難:

簡單的排序算法思想,能夠衍生出複雜的排序算法。這也是我寫這個系列的緣由,可能不少人,作了好幾年的業務,也不必定用到算法。可是你的某些行爲可能偏偏就是算法思想數組

廢話很少說,直接開始了

 

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

首先咱們有這麼一段數據,咱們須要將他們從新整合有序

| 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |架構

第一次排序

  • 用選擇排序的思路就是先找到,最小數 1
    | 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |

而後將如今的座標 1 的數值進行一次交換函數

7進行交換位置1性能

通過這次交換後,獲得如下數據。而且 1 也是最終位置學習

1 | 2 | 7 | 5 | 4 | 6 | 9 | 3 | 8 |優化

第二次排序

  • 而後咱們再找到此時的最小數 2
    | 1 | 2 | 7 | 5 | 4 | 6 | 9 | 3 | 8 |
  • 咱們發現 2, 就在最終位置。咱們能夠簡單一點,直接不動
  • 通過這次交換後,獲得如下數據。而且 2 也是最終位置
    | 1 | 2 | 7 | 5 | 4 | 6 | 9 | 3 | 8 |

第三次排序

  • 而後咱們繼續在當前數據中繼續尋找第三個,最小數 3,當前位置第一是 7
    | 1 | 2 | 7 | 5 | 4 | 6 | 9 | 3 | 8 |
  • 而後將如今的座標 3 的數值進行一次交換
    7進行交換位置3
  • 此時數據是這樣的
    | 1 | 2 | 3 | 5 | 4 | 6 | 9 | 7 | 8 |

第四次排序

  • 而後咱們繼續在當前數據中繼續尋找第四個,最小數 4,當前位置第一是 5
  • 5進行交換位置4
  • 此時數據是這樣的
    | 1 | 2 | 3 | 4 | 5 | 6 | 9 | 7 | 8 |

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


 

實現一下代碼,第一步#

  • 生成數組,同時把生成數組的耗時記錄一下
/** 記錄開始時間 */
$timeStart =   millisecond();
/** 生成一個 100 的隨機數組,從 1 開始到 100 */
$sort =   generateSort($num,1,$num);
/** 記錄結束時間 */
$timeEnd =   millisecond();
/** 結束時間 - 開始時間,之後再也不申明 */
var_dump('生成數組須要時間:'. ($timeEnd - $timeStart) . " / ms");

第二步

  • 進行排序,同時把排序性能耗時記錄一下
    tips: 在 php 當中,while 要比 for 快一丟丟
  • 至於爲何這裏用 for,多是博主不會用 while 吧
/**
* 選擇排序操做方法 - for
* @param $sort
* @param $n
* @return mixed
*/
function get_select_sort_for($sort,$n){
  /** 將數據循環一次 */
  for($i = 0;$i < $n;$i++){
      /** 尋找數據中的最小值,同時跨過第一個元素 */
      for($j = $i + 1;$j < $n;$j++){
          /** 經過循環對比獲得最小值 */
          if($sort[$i] > $sort[$j]){
              /** 
                * 將最小值和當前的第一個元素進行位置交換
                * php 沒有位置交換的函數,因此簡單一點,先取出,再覆蓋
                */
              $item = $sort[$i];
              $sort[$i]   = $sort[$j];
              $sort[$j]   = $item;
          }
      }
  }  
  return $sort;
}

whilespa

/**
* 選擇排序操做方法 - while
* @param $sort
* @param $n
* @return mixed
*/
function get_select_sort_while($sort,$n){
  $i = 0;
  while($i < $n){
      $j = $i + 1;
      while($j < $n){
          if($sort[$i] > $sort[$j]){
              $item = $sort[$i];
              $sort[$i]   = $sort[$j];
              $sort[$j]   = $item;
          }
      $j++;
      }
  $i++;
  }
  return $sort;
}

第三步

  • 驗證數組是否正確,記錄時間
/** 記錄排序開始時間 */
$sortStart   =   millisecond();
/** 調用上面的排序方法 */
$result =   get_select_sort_for($sort,$num);
/** 記錄排序結束時間 */
$sortEnd = millisecond();
var_dump('排序耗時:'. ($sortEnd - $sortStart) . " / ms");
/** 驗證是否有序 */
$msg    =   isSort($result) ? 'Yes':'No';
var_dump('排序是否正確 ? :' . $msg);
var_dump('本次排序大小:'. $num);

第四步

  • 基本就是這樣,簡簡單單的完成了。
  • 若是有疑問,或者寫錯的地方,請在下面評論留言
  • 你們加油

更多學習內容請訪問:

騰訊T3-T4標準精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)

相關文章
相關標籤/搜索