108課綱國中資訊科技人工智慧與演算法課程設計

更新時間:2021年4月12日


演算法基本介紹-排序

排序演算法(Sorting algorithm)

對雜亂無章的原始資料 ( Raw Data ) 進行整理、做排序的動作,在整個資訊科學或者電腦程式設計上都是十分重要的一件工作

在資訊科學,排序演算法是一種能將一串資料依照特定排序方式進行排列的一種演算法。最常用到的排序方式是數值順序以及字典順序排序法,就是將一堆沒有排序過的數字由小到大(或大到小)排列好的演算法

資料引用:https://jason-chen-1992.weebly.com/home/-sorting-algorithm

已知的排序演算法超過幾十種,常見的排序演算法有:

活動

實作1-排序遊戲-天平遊戲

校內:http://10.231.114.1/luti/109-2-an/html5_sort_scale/sort_scale.html

http://163.22.72.196/html5/html5_sort_scale/sort_scale.html

遊戲玩法:

按下「開始」之後,利用畫面中央的天平,將畫面上八個瓶子按照重量大小順序排列,排列後按下「完成」,並檢查你的答案是否正確。對於順序的排列,如果有更好的方法,可以有效地減少完成所需的時間

解說1:

https://sites.google.com/ntjh.ntct.edu.tw/cstt/06-%E6%8E%92%E5%BA%8F%E6%BC%94%E7%AE%97%E6%B3%95

實作2-排序演算法視覺化操作

解說:

(1)氣泡排序法(Bubble Sort)


它演算法的想法是,從頭開始走訪我們要進行排序的數列,然後每次比較數列中相鄰的兩個元素,如果他們大小順序錯誤的話就讓他們互換,如此重複到再也沒有需要交換,即代表排序完成。演算流程如下圖


你可以看到,其中比較大or比較小 ( 取決於你要從小排到大;還是從大排到小 ) 的元素會被慢慢換到數列的最前面,這個過程就像水中的小泡泡慢慢浮上水面一樣,所以叫Bubble Sort。

資料引用:https://jason-chen-1992.weebly.com/home/-sorting-algorithm

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

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

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

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

(1)找最小(大)值


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


(2)丟到左邊

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


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

(3)插入排序法 (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] 的陣列,在下面的圖中,我們把尚未排序過的數字用紅色標示,這輪要插入的值以橘色標示,排序過的以藍色標示。

 

(4)快速排序法(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開始看

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

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

遊戲三關順序

參考資料

排序演算法評量

(1)排序演算法學習單(Open Book)

下載

(2)排序演算法實作評量(程式框架及自我學習法)

氣泡排序法程式實作問題抽象化

教學影片

第一輪(回合)排序:

(1)在左端的第1張紙牌上方放置紅色星星標記(回合數)為j. 在第5張紙牌上方放置藍色星星標記為i.

(2)紅色星星放在第一個位置(j=1).藍色星星放在第五個位置(i=5)

(2)從右至左依序查看i和i-1位置相鄰的的兩張紙牌並比較兩張牌的大小.如果紙牌i小於紙牌i-1.則交換兩者的位置.然後將藍色星星向左移動1步(i=i-1)

(3)重複上述操作直到藍色星星與紅色星星碰在一起(i=j).到此結束第一輪排序.紙牌1排好了

第二輪(回合)排序:

紅色星星向右移動1步(j=j+1)..然後依照前述的步驟進行比較及交換.直到藍色星星與紅色星星碰在一起..到此結束第二輪排序紙牌5點排好了


第三輪(回合)排序:

重複上述的排序步驟. 紙牌6點排好了


第四輪(回合)排序:

重複上述的排序步驟.紙牌7點排好了.5張紙牌整個氣泡排序過程結束已經按照從小到大的順序排列完畢

5個數共進行了4輪==>n個數(n-1)輪

5個數比較4+3+2+1=10次==>n個數比(n*(n-1)/2)次

氣泡排序法基礎實作

原始程式下載

程式執行結果

氣泡排序法Scratch教學影片

(1)利用清單建立隨機值(字)資料.運用函式積木簡化程式

(2)外層迴圈(回合數).內層迴圈(比較次數)

(3)判斷是否交換(相鄰兩數)

(4)交換數函式及測試程式

資料引用大陸B站:https://www.bilibili.com/video/BV1aT4y1571n(由5:00開始看)

小學生的算法課冒泡排序

http://10.231.114.1/luti/109-2-an/bubble.mp4

參考程式積木

測試程式

修改清單長度及數字範圍

氣泡排序法進階實作

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