基本演算法介紹-選擇.插入.快速排序法


實作1-排序演算法動畫操作

解說:

(1)選擇排序法 (Selection Sort)

選擇排序可以說是最簡單最直觀的排序演算法了, 它演算法的概念很簡單,一個一個檢查未排序的資料,找最小(或最大)的從頭開始排,如此重複執行到結束

圖片來源:https://jason-chen-1992.weebly.com/home/selection-merge-heap

基本來說,選擇排序只需要重複執行兩個步驟,分別是:

(1)找最小(大)值


從「未排序好的數字」中找到最小(大)值


(2)丟到左邊

把最小(大)值丟到「未排序好的數字」的最左邊,把它標示成已排序好


假設有一個 [41, 33, 17, 80, 61, 5, 55] 的陣列,我們用圖的例子來一步一步理解選擇排序是如何進行,在下面的圖中,我們把尚未排序好的數字用紅色標示,這輪找到的最小值以橘色標示,排序好的以藍色標示。

(2)插入排序法 (Insertion Sort)

圖片來源:https://commons.wikimedia.org/wiki/File:Insertion-sort-example.gif?uselang=zh-hant

插入排序是一種非常簡單、直觀的排序演算法。它的想法是,將還未排序的元素從已排序的序列由後向前一一比較,找到它們在以排序數列中的位子將它們插入進去,直至所有未排序的元素都以插入已排序的數列中。
平常在玩樸克牌的時候,莊家一張一張發牌,然後你一張一張的把牌依照順序加入你的手牌的過程。

插入排序法 Insertion Sort 則是另外一個非常常見的排序法。簡單來說,插入排序法就是你玩撲克牌時用到的排序法。

(1)讀一個數字

從「未排序過的數字」中讀取一個數

(2)插入合適位置

把這個讀取的數往前插入一個位置

假設有一個 [41, 33, 17, 80, 61, 5, 55] 的陣列,在下面的圖中,我們把尚未排序過的數字用紅色標示,這輪要插入的值以橘色標示,排序過的以藍色標示。

 

(3)快速排序法(Quick sort)

Quick Sort採用了分治法(Divide and conquer),其的精神就是,分而治之、各個擊破!


基於這個策略,Quick Sort 會將要進行排序的序列( list ) 分割成兩個子序列( sub-list ),步驟為:

1.從數列中挑選出一個元素( Element ) 作為基準( Pivot )

2.重新排序數列,所有小於 Pivot 的元素擺放在 Pivot 前面,所有大於 Pivot 的元素擺在 Pivot 後面

至於等於 Pivot 可任意的擺在在其中一邊,到此為止的步驟可以稱做規劃或分割( Partition )

參考資料

https://class.tn.edu.tw/modules/tad_web/news.php?WebID=1384&NewsID=9575

https://scratch.mit.edu/projects/180636046/

https://sites.google.com/gapps.ntnu.edu.tw/ntnucsie-

highschool/%E9%A6%96%E9%A0%81/%E6%BC%94%E7%AE%97%E6%B3%95/%E6%BC%94%E7%AE%97%E6%B3%95%E6%8E%92%E5%BA%8F


排序演算法效能比較

思考問題:如何判斷程式或演算法的效率到底好不好?

(1)演算法的時間複雜度

「時間複雜度」簡單來說,就是電腦跑這個演算法所需花費的時間

範例

用訂購搶票的案例來說,時間複雜度就是在多少的時間內,算出搶票的先後順序,能在越短內時間演算出結果越好。

(2)演算法的空間複雜度

空間複雜度的意涵,可以理解成要完成這個演算法,要耗費多少系統運算資源(記憶體)

範例

例如搶票系統,我們必須使用十台機器,才能應付一千人的搶票流量,機器數量也是能越少越好,畢竟大家都希望能用最少的資源完成目標。

1'54開始看

參考資料

http://peanut.lkjh.tyc.edu.tw/moodle/course/view.php?id=2

https://www.shopjkl.com/pages/algorithm

https://forum.gamer.com.tw/Co.php?bsn=60292&sn=10716


實作2-排序演算法RPG遊戲(氣泡.選擇.插入排序法)

遊戲下載(遊戲開發:師大許庭嘉教授團隊)

遊戲三關順序