• 沒有找到結果。

排 序 1

N/A
N/A
Protected

Academic year: 2022

Share "排 序 1"

Copied!
36
0
0

加載中.... (立即查看全文)

全文

(1)

本章概念

排  序

1

1-1 排序演算法 P.06

什麼是排序、

插入排序法、

選擇排序法、

氣泡排序法

1-2 程式實作—氣泡排序法 P.19

利用變數完成交換資料、

利用函式完成氣泡排序法

4

p004-039_ch1.indd 4

p004-039_ch1.indd 4 2020/10/2 下午 04:26:292020/10/2 下午 04:26:29

(2)

高低進行排名。而用來將原本雜亂無章的物品或資料依序排列的方法,

就稱為「排序演算法」。

5

p004-039_ch1.indd 5

p004-039_ch1.indd 5 2020/10/2 下午 04:26:312020/10/2 下午 04:26:31

(3)

排序演算法

1-1 1-1

1 什麼是排序

排序( S ort )是將一群資料(數字、文字等),依 照使用者需求予以重新排列順序,以方便獲取資訊,或 進一步統計與分析。排序的方式分為「遞增排序(由小 到大)」或「遞減排序(由大到小)」兩種(圖 1-1-1)。

右表是某班的期中考成績 資料。想一想,右表經過什麼 處理,可方便獲取以下所需的 資訊?

1. 班導師想知道班上的前 3 名 是誰,要在班會上表揚嘉獎。

2. 老師想找出班上數學成績最 低的幾位同學,要為他們進 行補救教學。

手腦並用

座號 姓名 國文 英語 數學 自然 社會 總分 1 陳小輝 78 92 87 98 81 436 2 王小芳 93 93 81 93 81 441 3 李小群 84 75 54 74 75 362 4 林小天 94 94 84 87 93 452 5 黃小玲 94 100 97 91 95 477 6 洪小玉 85 81 52 94 71 383 7 張小文 90 78 91 93 90 442 8 邱小珍 78 79 57 85 77 376 9 郭小安 84 85 57 90 82 398 10 吳小芬 87 77 96 96 85 441

身高

155cm 177cm 150cm 161cm 183cm

身高

150cm 155cm 161cm 177cm 183cm

身高

183cm 177cm 161cm 155cm 150cm

依身高遞增 依身高遞減

圖 1-1-1

資料經過排序之後,

可方便我們獲取資訊。

6

資訊科技篇

p004-039_ch1.indd 6

p004-039_ch1.indd 6 2020/10/2 下午 04:26:312020/10/2 下午 04:26:31

(4)

在手腦並用的範例中,我們可以依據不同的需求,選擇特定的 欄位、用適當的方式進行排序,以方便獲取所需的資訊:

1. 依「座號」進行「遞增排序」,方便同學找到自己的成績。

座號 姓名 國文 英語 數學 自然 社會 總分

1 陳小輝 78 92 87 98 81 436

2 王小芳 93 93 81 93 81 441

3 李小群 84 75 54 74 75 362

4 林小天 94 94 84 87 93 452

5 黃小玲 94 100 97 91 95 477

6 洪小玉 85 81 52 94 71 383

7 張小文 90 78 91 93 90 442

8 邱小珍 78 79 57 85 77 376

9 郭小安 84 85 57 90 82 398

10 吳小芬 87 77 96 96 85 441

2. 依「總分」進行「遞減排序」,方便得知每個人的成績高低比較。

座號 姓名 國文 英語 數學 自然 社會 總分

5 黃小玲 94 100 97 91 95 477

4 林小天 94 94 84 87 93 452

7 張小文 90 78 91 93 90 442

2 王小芳 93 93 81 93 81 441

10 吳小芬 87 77 96 96 85 441

1 陳小輝 78 92 87 98 81 436

3. 依「數學分數」進行「遞增排序」,方便找出數學成績最低的幾 位同學。

座號 姓名 國文 英語 數學 自然 社會 總分

6 洪小玉 85 81 52 94 71 383

3 李小群 84 75 54 74 75 362

9 郭小安 84 85 57 90 82 398

8 邱小珍 78 79 57 85 77 376

2 王小芳 93 93 81 93 81 441

4 林小天 94 94 84 87 93 452

1

  序

1-1 1-2

1-1 排序演算法

7

p004-039_ch1.indd 7

p004-039_ch1.indd 7 2020/10/2 下午 04:26:322020/10/2 下午 04:26:32

(5)

在試算表軟體中,我們可以經由簡單的動作,就完成資料的排序。

各種試算表軟體的操作方法均相似,請將資料貼入試算表中進行操作:

① 選擇要排序欄位中的一筆資料。

② 點擊「資料」功能表。

③ 選擇「遞增排序(A → Z)」或「遞減排序(Z → A)」的功能。

手腦並用

使用檔案1-1手腦並用.txt

Google試算表

Microsoft Excel

2

1

3 2

1

3

8

資訊科技篇

p004-039_ch1.indd 8

p004-039_ch1.indd 8 2020/10/2 下午 04:26:322020/10/2 下午 04:26:32

(6)

試算表軟體的「排序」功能,就是依照「排序演算法」

來為資料進行排序。隨著資訊科技不斷地發展,排序演算法 也不斷創新,常見的有插入排序法、選擇排序法、氣泡排序 法等,接下來,我們就來認識這些演算法的運行原理。

2 插入排序法

玩撲克牌時,每個玩家要輪流從桌上的牌堆中摸 1 張牌,

共要拿到4 張牌。若依序摸到下列 4 張牌,你通常會如何放到 手中?請將數字填到下圖中。

① 摸到 6 ② 摸到 9 ③ 摸到 2 ④ 摸到 5

手腦並用

當我們玩撲克牌時,通常會將手上的牌由小到大排序,

而逐一摸牌、比較大小、插入位置的過程,和「插入排序法」

的基本流程相似。

插入排序法 ( 遞增)

規則

① 將最前端的數當作「已排序」,把數值分為

「已排序」和「未排序」兩部分。

② 將「未排序的第1個數」,由後往前逐一和「已 排序」的數值比較,並插入到適當的位置。

③ 重複②,直到完成排序。

教材設計說明:

1. 本 節 流 程 解 說 均 以

「遞增排序」為主。

2. 排序資料中,我們以 左側為前端、右側為 後端。

位置

1

位置

2

位置

3

位置

4

1

  序

1-1 1-2

1-1 排序演算法

9

p004-039_ch1.indd 9

p004-039_ch1.indd 9 2020/10/2 下午 04:26:332020/10/2 下午 04:26:33

(7)

原始資料

8 7 10 6 9

第 1 輪掃描 (※ 先將第 1 個數當作已排序的數。)

7 8

將「未排序的第 1 個數」和「已排序的數」比較,並插入至已排序的適當位置。

第 2 輪掃描

將「未排序的第 1 個數」和「已排序的數」比較,並插入已排序的適當位置。

第 3 輪掃描

將「未排序的第 1 個數」和「已排序的數」比較,並插入至已排序的適當位置。

第 4 輪掃描

將「未排序的第 1 個數」和「已排序的數」比較,並插入至已排序的適當位置。

10 7, 8

6 7, 8, 10

9 6, 7, 8, 10

插入排序法‧流程解說

已排序 未排序

6 7 8 10 9

已排序 未排序

7 8 10 6 9

6 插在 7 前面

已排序 未排序

7 8 10 6 9

已排序 未排序

7 8 10 6 9

10 接在 8 之後(位置不動)

已排序 未排序

7 8 10 6 9

已排序 未排序

8 7 10 6 9

7 插在 8 前面

已排序

6 7 8 9 10

已排序 未排序

6 7 8 10 9

9 插在 8 和 10 之間

10

資訊科技篇

p004-039_ch1.indd 10

p004-039_ch1.indd 10 2020/10/2 下午 04:26:342020/10/2 下午 04:26:34

(8)

1. 插入排序法演練:

(1) 請兩人一組,利用課本附件練習「插入排序法」。

(2) 隨機抽出 6 張課本附件 3 的紙牌,排放於附件 1 的紙牌位置上。

(3) 一人依照流程演示插入排序法,另一人協助確認流程的正確性。

(4) 執行完畢後,兩人交換任務,重新進行插入排序法的演練。

排序演算法

配合資訊科技篇第1章 附件 1

① 將數值分為「已排序」和「未排序」兩部分。

② 在「未排序」的數值中,將最後一個數值設為「比 較位置」,並和前方相鄰的數比較,若前數>後 數,兩數交換。

③ 將步驟②中較小的數,設為新的「比較位置」,再 與前方的數比較、交換。

④ 重複③,當最小的數移動到最前面,完成此數的排 序,結束一輪掃描。

⑤ 重複②、③、④,依次完成所有數值的排序。

若要改為遞減排序,則較大的數應往前排,故步驟

②改為「前數>後數時,兩數交換」。

(遞

① 將數值分為「已排序」和「未排序」兩部分。

② 在「未排序的數字」中找到「最小值」,和「未排 序的第1個數」交換,完成1個數的排序。

③ 重複②,直到排序完成。

若要改為遞減排序,則步驟②中改為尋找「最大 值」。

(遞

① 將最前端的數當作「已排序」,把數值分為「已排 序」和「未排序」兩部分。

② 將「未排序的第1個數」,由後往前逐一和「已排 序」的數值比較,並插入到適當的位置。

③ 重覆②,直到完成排序。

(遞

位置1 位置2 位置3 位置4 位置5 位置6

最前端 最末端

附件1&2.indd 1

附件1&2.indd 1 2020/8/6 下午 03:31:152020/8/6 下午 03:31:15

2. 請利用「插入排序法」將「42、34、2、21、15、49」這 6 個數由小至 大排序,並在下圖中寫出每一輪的排序結果。

手腦並用

42 34 2 21 15 49

原始資料

第1 輪結果

第2 輪結果

第3 輪結果

第4 輪結果

第5 輪結果

1

  序

1-1 1-2

1-1 排序演算法

11

p004-039_ch1.indd 11

p004-039_ch1.indd 11 2020/10/2 下午 04:26:352020/10/2 下午 04:26:35

(9)

3 選擇排序法

想一想,整理書架上的雜誌時 ( 如下圖左 ),除了前面介紹的「插入 排序法」之外,你還能用什麼方法讓這些雜誌依序排列(如下圖右)?

請簡單說明規則。

手腦並用

1

No.

資 訊 世 界

2

No.

資 訊 世 界

3

No.

資 訊 世 界

4

No.

資 訊 世 界

5

No.

資 訊 世 界

3

No.

資 訊 世 界

2

No.

資 訊 世 界

5

No.

資 訊 世 界

1

No.

資 訊 世 界

4

No.

資 訊 世 界

排序前 排序後

在生活中,我們可能會用到「先找出最小的號碼」,排在第 1 位;

然後再「找出第二小的號碼」,排在第 2 位,依此類推。這樣的排 序概念,就與「選擇排序法」相似。

選擇排序法(遞增)

規則

① 將數值分為「已排序」和「未排序」兩部分。

② 在「未排序的數字」中找到「最小值」,和「未排序的 第1個數」交換,完成1個數的排序。

③ 重複②,直到排序完成。

若要改為遞減排序,則步驟②中改為尋找「最大值」。

12

資訊科技篇

p004-039_ch1.indd 12

p004-039_ch1.indd 12 2020/10/2 下午 04:26:362020/10/2 下午 04:26:36

(10)

原始資料

No. 13 No. 12 No. 15 No. 11 No. 14

第 1 輪掃描

找出「未排序中的最小值」,和「未排序的第 1 個數」交換。

第 2 輪掃描

找出「未排序中的最小值」,和「未排序的第 1 個數」交換。

第 3 輪掃描

找出「未排序中的最小值」,和「未排序的第 1 個數」交換。

第 4 輪掃描

找出「未排序中的最小值」,和「未排序的第 1 個數」交換。

11 13

12 12

13 15

14 15

選擇排序法‧流程解說

已排序 未排序

No. 11 No. 12 No. 15 No. 13 No. 14

No. 13

No. 12 No. 15 No. 11

No. 14

未排序

對調

第 1 數 最小值

已排序 未排序

No. 11 No. 12 No. 13 No. 15 No. 14

已排序 未排序

No. 11 No. 12 No. 15 No. 13

No. 14

第 1 數 最小值 對調

已排序 未排序

No. 11 No. 12 No. 15 No. 13 No. 14

已排序 未排序 No. 11 No. 12

No. 15 No. 13 No. 14

第 1 數

最小值 第 1 數即為最小值,位置不動

已排序

No. 11 No. 12 No. 13 No. 14 No. 15

已排序 未排序

No. 11 No. 12 No. 13 No. 15 No. 14

第 1 數 最小值 對調

最後一輪掃描時,

會讓最後 2 個數完成排序。

1

  序

1-1 1-2

1-1 排序演算法

13

p004-039_ch1.indd 13

p004-039_ch1.indd 13 2020/10/2 下午 04:26:362020/10/2 下午 04:26:36

(11)

1. 選擇排序法演練:

(1) 請兩人一組,利用課本附件練習「選擇排序法」。

(2) 隨機抽出6 張課本附件 3 的紙牌,排放於附件 1 的紙牌位置上。

(3) 一人依照流程演示選擇排序法,另一人協助確認流程的正確性。

(4) 執行完畢後,兩人交換任務,重新進行選擇排序法的演練。

排序演算法

配合資訊科技篇第1章 附件 1

① 將數值分為「已排序」和「未排序」兩部分。

② 在「未排序」的數值中,將最後一個數值設為「比 較位置」,並和前方相鄰的數比較,若前數>後 數,兩數交換。

③ 將步驟②中較小的數,設為新的「比較位置」,再 與前方的數比較、交換。

④ 重複③,當最小的數移動到最前面,完成此數的排 序,結束一輪掃描。

⑤ 重複②、③、④,依次完成所有數值的排序。

若要改為遞減排序,則較大的數應往前排,故步驟

②改為「前數>後數時,兩數交換」。

(遞

① 將數值分為「已排序」和「未排序」兩部分。

② 在「未排序的數字」中找到「最小值」,和「未排 序的第1個數」交換,完成1個數的排序。

③ 重複②,直到排序完成。

若要改為遞減排序,則步驟②中改為尋找「最大 值」。

(遞

① 將最前端的數當作「已排序」,把數值分為「已排 序」和「未排序」兩部分。

② 將「未排序的第1個數」,由後往前逐一和「已排 序」的數值比較,並插入到適當的位置。

③ 重覆②,直到完成排序。

(遞

位置1 位置2 位置3 位置4 位置5 位置6

最前端 最末端

附件1&2.indd 1

附件1&2.indd 1 2020/8/6 下午 03:31:152020/8/6 下午 03:31:15

2. 請利用「選擇排序法」將「42、34、2、21、15、49」這 6 個數由小至 大排序,並在下圖中寫出每一輪的排序結果。

手腦並用

原始資料

第1 輪結果

第2 輪結果

第3 輪結果

第4 輪結果

第5 輪結果

42 34 2 21 15 49

14

資訊科技篇

p004-039_ch1.indd 14

p004-039_ch1.indd 14 2020/10/2 下午 04:26:372020/10/2 下午 04:26:37

(12)

氣泡排序法(遞增)

規則

① 將數值分為「已排序」和「未排序」兩部分。

② 在「未排序」的數值中,將最後一個數值設為「比較 位置」,並和前方相鄰的數比較,若前數>後數,兩數 交換。

③ 將步驟②中較小的數,設為新的「比較位置」,再與前 方的數比較、交換。

④ 重複③,當最小的數移動到最前面,完成此數的排序,

結束一輪掃描。

⑤ 重複②、③、④,依次完成所有數值的排序。

若要改為遞減排序,則較大的數應往前排,故步驟②改 為「前數>後數時,兩數交換」。

比較位置

4 氣泡排序法

幼兒園幼幼班的老師希望小朋友們依照身高由矮到高依序排隊,

但是小朋友們還太小,不知道自己的身高是幾公分。想一想,有什麼 方法可以幫助老師完成任務?

手腦並用

我們可以讓小朋友先排好一列,讓相鄰的兩人比較身高,高的 往右站、矮的往左站,逐一比較並交換;這種兩兩比較、交換位置 的排序方式,就和「氣泡排序法」的概念相同。

1

  序

1-1 1-2

1-1 排序演算法

15

p004-039_ch1.indd 15

p004-039_ch1.indd 15 2020/10/2 下午 04:26:382020/10/2 下午 04:26:38

(13)

氣泡排序法‧流程解說 原始資料

89 90

95 92 87

已排序 未排序

90 92 87 89 95

89 92 90

已排序 未排序

87 95

第 1 輪結果 第 2 輪結果

第 1 輪掃描 第 2 輪掃描

第 1 次 比 較

第 1 次 比 較

第 2 次 比 較

第 2 次 比 較

第 3 次 比 較

第 3 次 比 較

第 4 次 比 較

89 90

95 92 87

未排序

前數 < 後數

不換

89 90

95 92 87

前數 > 後數

89 90

95 87 92

前數 > 後數

已排序

89 90

87 95 92

前數 < 後數

不換

已排序

89 90

87 95 92

前數 > 後數

已排序 未排序

89 90

87 95 92

前數 > 後數

89 90

95 87 92

前數 > 後數

比較位置

比較位置

比較位置 比較位置

比較位置

比較位置

比較位置

16

資訊科技篇

p004-039_ch1.indd 16

p004-039_ch1.indd 16 2020/10/2 下午 04:26:392020/10/2 下午 04:26:39

(14)

已排序

90 92

87 89 95

92

已排序 未排序

90 95 87 89

第 3 輪結果 第 4 輪結果

第 3 輪掃描 第 4 輪掃描

第 1 次 比 較

第 1 次 比 較

第 2 次 比 較

90 92

已排序 未排序

89 95 87

前數 < 後數

不換

已排序 未排序

89 90 95

87 92

前數 > 後數

比較位置

比較位置

比較位置

已排序

89 95 90 92

前數 > 後數

87

1

  序

1-1 1-2

1-1 排序演算法

17

p004-039_ch1.indd 17

p004-039_ch1.indd 17 2020/12/16 下午 12:10:192020/12/16 下午 12:10:19

(15)

1. 氣泡排序法演練:

(1) 請兩人一組,利用課本附件練習「氣泡排序法」。

(2) 隨機抽出 6 張課本附件 3 的紙牌,排放於附件 1 的紙牌位置上。

(3) 一人依照流程演示氣泡排序法,另一人協助確認流程的正確性。

(4) 執行完畢後,兩人交換任務,重新進行氣泡排序法的演練。

排序演算法

配合資訊科技篇第1章 附件 1

① 將數值分為「已排序」和「未排序」兩部分。

② 在「未排序」的數值中,將最後一個數值設為「比 較位置」,並和前方相鄰的數比較,若前數>後 數,兩數交換。

③ 將步驟②中較小的數,設為新的「比較位置」,再 與前方的數比較、交換。

④ 重複③,當最小的數移動到最前面,完成此數的排 序,結束一輪掃描。

⑤ 重複②、③、④,依次完成所有數值的排序。

若要改為遞減排序,則較大的數應往前排,故步驟

②改為「前數>後數時,兩數交換」。

(遞

① 將數值分為「已排序」和「未排序」兩部分。

② 在「未排序的數字」中找到「最小值」,和「未排 序的第1個數」交換,完成1個數的排序。

③ 重複②,直到排序完成。

若要改為遞減排序,則步驟②中改為尋找「最大 值」。

(遞

① 將最前端的數當作「已排序」,把數值分為「已排 序」和「未排序」兩部分。

② 將「未排序的第1個數」,由後往前逐一和「已排 序」的數值比較,並插入到適當的位置。

③ 重覆②,直到完成排序。

(遞

位置1 位置2 位置3 位置4 位置5 位置6

最前端 最末端

附件1&2.indd 1

附件1&2.indd 1 2020/8/6 下午 03:31:152020/8/6 下午 03:31:15

2. 請利用「氣泡排序法」將「42、34、2、21、15、49」這 6 個數由小至 大排序,並在下圖中寫出每一輪的排序結果。

手腦並用

原始資料

第1 輪結果

第2 輪結果

第3 輪結果

第4 輪結果

第5 輪結果

42 34 2 21 15 49

18

資訊科技篇

p004-039_ch1.indd 18

p004-039_ch1.indd 18 2020/10/2 下午 04:26:402020/10/2 下午 04:26:40

(16)

程式實作 —氣泡排序法

1-2 1-2

搭配 P.15 ∼ 18 的說明內容,現在我們要 利用 Scratch 完成氣泡排序法的程式實作。

請播放範例影片 氣泡排序法.mp4 ,觀察 程式的執行情形,利用 1-2-1.sb3 來撰寫程式。

檔案中已完成 自動發牌 、 手動發牌 ,以及出 場角色的設定與動畫,方便我們看出程式的運作 情形。

【程式摘要】

1. 先點擊

自動發牌

,程式會自動在 紙牌清單 中產生 5 個數字,或點擊

手動發牌

,自行 輸入 5 個數字。

2. 完成

排序

的程式:點擊

排序

,程式要利 用氣泡排序法,將 紙牌清單 中的數字由小至 大排序。(如右圖)

搭配【逐步解析】說明

題目解析流程

任務說明

檔案 1-2 下載方式請見 P.3

開始

結束

不成立 成立

成立 不成立

設定要 掃描幾輪

一輪之中 重複比較交換

設定下一 輪掃描次 數與位置

設定

比較位置 後數<前數

最後一輪 完成?

3

交換兩數

1、2

1

  序

1-1 1-2

1-2 程式實作──氣泡排序法

19

p004-039_ch1.indd 19

p004-039_ch1.indd 19 2020/10/2 下午 04:26:412020/10/2 下午 04:26:41

(17)

在這一節中,我們將運用已經 學過的各項積木功能與程式技巧,

包括變數、清單、函式、雙層迴圈,

以 S cratch 來實現「氣泡排序法」

的程式。

學習目標

1. 利用變數完成交換資料。

2. 利用函式完成氣泡排序法。

1. 右圖 1 中有一杯果汁、一杯 可樂。想一想,在現實生活 中,若要將兩杯飲料的杯子 互相交換(如圖2),你會 怎麼做?

2. 小真寫了一個「兩數交換」的程式,如圖 3 所示。若以清單中的 16、15 兩個數字進行測試,執行結果如圖 4。說說看,為什麼交換 的結果出錯了呢?

手腦並用

果汁

可樂 圖2

可樂

果汁 圖1

圖3

圖4

20

資訊科技篇

p004-039_ch1.indd 20

p004-039_ch1.indd 20 2020/10/2 下午 04:26:422020/10/2 下午 04:26:42

(18)

1

點擊角色 觸發程式

2

判斷是否 要交換

3

兩數交換

1

點擊角色 觸發程式

(1) 點擊角色開始執行程式:

2

判斷是否 要交換

(1) 交換條件:當後數<前數時

(2) 選擇結構:

只有條件成立時要執行動作,

不成立時無動作,

因此使用「單向選擇結構」。

問題思考

解題分析

在氣泡排序法中,都是以相鄰的 兩個數為一組,進行比較與交換。現 在,我們要完成「兩數的比較與交換」

程式。

請先點擊 在 紙牌清單 中輸入兩個數字,並在

排序

中撰寫 程式,當

排序

被點擊時執行程式,

若清單中第 2 項(後數)的數值<第 1 項(前數)的數值時,兩數交換。

兩數的比較與交換 使用檔案

1-2-1.sb3

逐步解析 1 1

狀況 1 後數≧前數:不變

狀況 2 後數<前數:兩數交換

教材設計說明:

在 Scratch 清單中,我 們以上方代表資料前端、

下方則是資料後端。

1

  序

1-1 1-2

1-2 程式實作──氣泡排序法

21

p004-039_ch1.indd 21

p004-039_ch1.indd 21 2020/10/2 下午 04:26:422020/10/2 下午 04:26:42

(19)

3

兩數交換

(1) 設定變數:

為了避免資料在交換時被覆蓋,我們 要設定一個變數 暫存 用來存放資料。

(2) 交換流程:(如右圖)

① 複製 資料 2 的資料到 暫存 中。

② 複製 資料 1 的資料到 資料 2 中。

③ 複製 暫存 的資料到 資料 1 中。

初始 狀態

資料1 資料2 暫存

A B

① A B B

② A A B

③ B A B

【參考程式】

01 02 03 04 05

2 1

3

01

*

02 03 04 05 06

*

07

為了配合程式中預設的紙牌動畫呈現,增加第 02、07 行的動畫呈現積木,方便觀察資料的變化。

此兩個函式僅在呈現排序過程以幫助觀察與理解,與排 序的結果無關,完整函式內容請見檔案 1-2-1.sb3 。

※ 後續課程均延續使用此程式。

22

資訊科技篇

p004-039_ch1.indd 22

p004-039_ch1.indd 22 2020/10/2 下午 04:26:432020/10/2 下午 04:26:43

(20)

1

設定函式

2

設定參數

3

呼叫函式

1

設定函式

(1) 使用 函式類 的 自定函式。

(2) 將函式命名為「比較與交換」。

(3) 將【逐步解析 1】中 當角色被點擊 下的程式,

移到定義函式下方。

移動

問題思考

解題分析

由於氣泡排序的過程中,要重複進行相鄰兩數的比較與交換,因此,我們 要將【逐步解析 1】的程式設定成函式 比較與交換 ,方便後續呼叫使用。

設定函式:比較與交換

逐步解析 2 2 1   排 序

1-1 1-2

1-2 程式實作──氣泡排序法

23

p004-039_ch1.indd 23

p004-039_ch1.indd 23 2020/10/2 下午 04:26:442020/10/2 下午 04:26:44

(21)

2

設定參數

(1) 概念說明:

【逐步解析1】的程式會固定比較清單中第 2 項與第 1 項的值,然而設定成 函式之後,要用在各種不同的時機,例如:「第5 項與第 4 項的比較」、「第 4 項與第 3 項的比較」等,因此必須設定函式的「參數」,以利呼叫使用。

(2) 定義函式的參數:

① 在定義好的積木上按 右鍵 。

② 點擊 編輯 以修改函式。

③ 點擊 2 次 添加輸入方塊 ,增加 2 個參數。

④ 將參數的名稱設定為「後數」、「前數」。

⑤ 按 確定 ,完成修改。

5 4

3

1

右鍵

2

(3) 修改程式中的參數:

將原程式中固定的數字,用參數取代。

24

資訊科技篇

p004-039_ch1.indd 24

p004-039_ch1.indd 24 2020/10/2 下午 04:26:442020/10/2 下午 04:26:44

(22)

3

呼叫函式

(1) 呼叫函式:

在 當角色被點擊 下加入要呼叫的函式積木。

(2) 傳送參數:

① 原程式是「第 2 項」和「第 1 項」比,

故參數應設為「2」和「1」。

② 請執行程式,觀察 紙牌清單 內的數字,

測試兩數的氣泡排序是否仍能正常運作。

新增

修改

【參考程式】

*

代表本次新增、或進行修改的程式)

*

01 02

*

03

*

04

*

05

*

06 07

1 2

01

*

02

3

1

  序

1-1 1-2

1-2 程式實作──氣泡排序法

25

p004-039_ch1.indd 25

p004-039_ch1.indd 25 2020/10/2 下午 04:26:452020/10/2 下午 04:26:45

(23)

手腦並用

1. 以下為 Scratch 清單中,4 個數由小至大排列的氣泡排序法執行過程。

(1) 各輪掃描分別進行幾次比較?請填入空格中。

(2) 各次比較分別比較哪兩個數?請用 符號標示出來。

(3) 各輪掃描結果中,哪些數字為已排序完成?請在 中打

2. 想一想:

(1) 「共要進行幾輪掃描」和「清單長度」之間,有什麼關係?

(2) 每一輪中的「比較次數」和「清單長度」、「第幾輪掃描」之間,有什麼關係?

第1 輪掃描 共比較 次 第1 輪結果

第2 輪掃描 共比較 次 第2 輪結果

第3 輪掃描 共比較 次 第3 輪結果

已排序

已排序

已排序

26

資訊科技篇

p004-039_ch1.indd 26

p004-039_ch1.indd 26 2020/10/2 下午 04:26:462020/10/2 下午 04:26:46

(24)

3. 請模擬 Scratch 中,5 個數由小至大排列的氣泡排序情形,寫下每輪的比較次數,將比較結 果填入空格中,並在每輪結果處勾選已排序的項目,再驗證是否符合第2 題觀察到的規律。

第1 輪掃描 共比較 次 第1 輪結果

第2 輪掃描 共比較 次 第2 輪結果

第3 輪掃描 共比較 次 第3 輪結果

第4 輪掃描 共比較 次 第4 輪結果

已排序

已排序

已排序

已排序

1

  序

1-1 1-2

1-2 程式實作──氣泡排序法

27

p004-039_ch1.indd 27

p004-039_ch1.indd 27 2020/10/2 下午 04:26:482020/10/2 下午 04:26:48

(25)

氣泡排序程式規畫

2. 程式特徵:

我們可以從步驟歸納中,看出以下特徵。

(1) 控制各輪掃描,要用到一層重複結構。

(2) 每一輪掃描要進行多次比較和交換,也 要用到一層重複結構。

要用到雙層重複結構(巢狀迴圈)。

1. 步驟歸納:

我們可以由「手腦並用」的實例中,歸 納出5 個數的氣泡排序程式執行步驟:

掃描

【清單長度-1】

各輪的重複掃描

比較

【清單長度-第幾輪】

一輪之中的重複比較

函式:比較與交換

若後數<前數,兩數交換

進入第一層 重複結構

進入第二層 重複結構

1 輪掃描

共比較4 次:

第5 數和前一數比 第4 數和前一數比 第3 數和前一數比 第2 數和前一數比

清單長度 清單長度-第幾輪

5 1

2 輪掃描

共比較3 次:

第5 數和前一數比 第4 數和前一數比 第3 數和前一數比

清單長度 清單長度-第幾輪

5 2

3 輪掃描

共比較2 次:

第5 數和前一數比 第4 數和前一數比

清單長度 清單長度-第幾輪

5 3

4 輪掃描

共比較1 次:

第5 數和前一數比

清單長度

總輪數=清單長度-1

清單長度-第幾輪

5 4

28

資訊科技篇

p004-039_ch1.indd 28

p004-039_ch1.indd 28 2020/10/2 下午 04:26:492020/10/2 下午 04:26:49

(26)

3. 各輪的掃描狀況: 4. 一輪之中的比較狀況:

掃描

【清單長度-1】

● 用變數 第幾輪 記錄現在是第幾輪:

第幾輪 從1 開始,逐輪加 1

(執行完一整輪的比較之後)

● 進行下一輪掃描: 第幾輪 的值加 1

比較

【清單長度-第幾輪】

● 用變數 比較位置 記錄要比較的位置:

每輪 比較位置 都從「清單長度」開始

(執行完一次比較之後)

● 進行下一次比較: 比較位置 的值減 1 (比較的位置往前移動一位)

1

  序

1-1 1-2

1-2 程式實作──氣泡排序法

29

p004-039_ch1.indd 29

p004-039_ch1.indd 29 2020/10/2 下午 04:26:502020/10/2 下午 04:26:50

(27)

1

完成

「各輪的重 複掃描」

2

完成

「一輪之中的 重複比較」

3

呼叫函式

1

完成「各 輪的重複 掃描」

(1) 程式重複執行多「輪」:

① 使用重複結構。

② 掃描輪數=清單長度- 。

(2) 記錄「目前進行哪一輪的比較」: 想一想,為什麼要記錄目前是第幾輪?

① 設定變數 來記錄第幾輪的比較。

② 起始值為 1。

③ 執行完整一輪的比較後, 的值要加1,再進入下一輪掃描。

一輪之中的比較

(1) ①、(1) ② (2) ①、(2) ②

(2) ③

問題思考

解題分析

現在,我們要依據 P.28 ∼ 29「氣泡排序程式規畫」整理的內容來撰寫程 式,讓清單中的數字由小至大排序。

完成氣泡排序

逐步解析 3 3

30

資訊科技篇

p004-039_ch1.indd 30

p004-039_ch1.indd 30 2020/10/2 下午 04:26:512020/10/2 下午 04:26:51

(28)

2

完成「 一輪 之中的重複 比較」

(1) 在每一輪中,要重複執行多次「比較」:

① 使用重複結構。

② 比較次數=清單長度- 。 (2) 記錄「比較的位置」:

① 設定變數 來記錄比較的位置。

② 每輪一開始都從最後一項往前比較,起始值均為「清單長度」。

③ 執行完一次比較後, 的值要減1,往前移動一項再進行比較。

呼叫函式:比較與交換

(1) ①、(1) ② (2) ①、(2) ②

(2) ③

3

呼叫函式

(1) 呼叫函式: 比較與交換 (2) 參數: 後數 →

前數 →

【參考程式】

*

代表本次新增、或進行修改的程式)

函式「比較與交換」的程式無修改,

請見P.25【逐步解析 2】的參考程式。

01

*

02

*

03

*

04

*

05

*

06

*

07

*

08

2 1

3

完成程式後,

請測試程式是否 能正常執行,並 觀察動畫中氣泡 排序的運作。

1

  序

1-1 1-2

1-2 程式實作──氣泡排序法

31

p004-039_ch1.indd 31

p004-039_ch1.indd 31 2020/10/2 下午 04:26:522020/10/2 下午 04:26:52

(29)

1-2 小試身手  神廟試煉

檔案 1-2 小試身手 下載方式請見 P.3

  考古學家在埃及發現了神秘的神廟遺 跡,想進入神廟就必須先解開眼前的謎題,

通過神廟試煉,才能獲得打開大門的鑰匙。

遊戲規則

1. 點擊兩個 玩家寶石 ,便可進行交換。

2. 當 玩家寶石 的顏色排列與 神廟寶石 一 樣,即可過關。

請以檔案 1-2小試身手. sb 3 完成本遊戲程式。

出場角色

1. :開始遊戲鈕

2. :神廟寶石 1 ∼ 5 3. :玩家寶石 1 ∼ 5

已完成項目

1. 開始遊戲鈕 :被點擊時,自動產生 神廟石板清單 與 玩家石板清單 的內容。

2. 神廟寶石 1 ∼ 5 、 玩家寶石 1 ∼ 5 :各寶石的造型切換與動畫呈現。

3. 玩家寶石 1 ∼ 5 : 各寶石被點擊時,自動將其編號存入 對調清單 中,

並廣播訊息「寶石點選」。

32

資訊科技篇

p004-039_ch1.indd 32

p004-039_ch1.indd 32 2020/10/2 下午 04:26:542020/10/2 下午 04:26:54

(30)

待完成項目

1. 請在角色 開始遊戲鈕 中, 之下撰寫程式。

2. 收到廣播訊息「寶石點選」之後進行判斷,若 對調清單 長度為 2:

(代表已經有 2 個寶石被點擊)

(1) 依據 對調清單 記錄的編號,交換 玩家石板清單 內對應的數字。

(2) 清空 對調清單 ,以利下一輪的交換。

(3) 廣播訊息「交換完畢」。(通知 玩家寶石 變換造型)

註 若 對調清單 長度不等於 2,代表還沒點擊 2 個寶石,因此程式無反應,等待下 一次寶石點選。

3. 收到廣播訊息「交換完畢」之後,確認 神廟石板清單 與 玩家石板清單 是否完全相 等,若相等則廣播訊息「遊戲結束」。

在 1-2小試身手.sb3 的程式中,部分角色程式已預先設定完成,我們僅負責完成「資料 交換」與「清單比對」。如果你想挑戰完整的遊戲設計製作,請參考下一頁的「程式地圖」,

利用檔案1-2神廟試煉_無程式.sb3 ,試著自己從頭開始完成這個遊戲!

手腦並用

1

  序

1-1 1-2

1-2 程式實作──氣泡排序法

33

p004-039_ch1.indd 33

p004-039_ch1.indd 33 2020/10/2 下午 04:26:552020/10/2 下午 04:26:55

(31)

當 被點擊時

當任意 玩家寶石 廣播訊息「寶石交換」

當綠旗被點擊

● 角色:開始遊戲鈕

當任意 玩家寶石 被點擊

當 廣播「遊戲結束」

程式開始階段

遊戲開始階段

寶石點選階段

寶石交換階段

遊戲結束階段

被點擊時:

1. 初始化變數 暫存 ,清空 神廟石板清單 、 玩家石板清單 與 對調清單 。

2. 分別產生 神廟石板清單 與 玩家石板清單 。

兩清單不相等,且內容分別為 1 ~ 5 不重複的數字。

3. 廣播訊息「遊戲開始」。

4. 背景切換為「遊戲開始」。

1. 定位。

2. 背景切換為「程式開始」。

收到廣播訊息「遊戲結束」:

背景切換為「遊戲結束」。

程式地圖

收到廣播訊息「寶石交換」:

1. 若 對調清單 長度為 2:

(1) 交換 玩家石板 中被點擊的 2 個寶石,

清空 對調清單 。

(2) 廣播訊息「交換完畢」。

收到廣播訊息「交換完畢」:

若 玩家石板清單 與 神廟石板清單 相同:

廣播訊息「遊戲結束」。

此處即為小試身手的程式段落。

34

資訊科技篇

p004-039_ch1.indd 34

p004-039_ch1.indd 34 2020/10/2 下午 04:26:592020/10/2 下午 04:26:59

(32)

● 角色:玩家寶石 1 ~ 5

收到廣播訊息「遊戲開始」:

1. 各寶石分別依據 玩家石板清單 中 的資料,切換對應的造型。

收到廣播訊息「交換完畢」:

1. 各寶石分別依據 玩家石板清單 中 的資料,切換對應的造型。

2. 恢復成原本亮度。

1. 定位。

2. 隱藏。

被點擊時:

1. 該寶石變暗。

2. 將其編號放入 對調清單 中。

3. 廣播訊息「寶石交換」。

收到廣播訊息「遊戲結束」:

隱藏。

● 角色:神廟寶石 1 ~ 5

收到廣播訊息「遊戲開始」:

1. 各寶石分別依據 神廟石板清單 中 的資料,切換對應的造型。

1. 定位。

2. 隱藏。

收到廣播訊息「遊戲結束」:

隱藏。

1

  序

1-1 1-2

1-2 程式實作──氣泡排序法

35

p004-039_ch1.indd 35

p004-039_ch1.indd 35 2020/10/2 下午 04:27:012020/10/2 下午 04:27:01

(33)

1章 學習重點

1-1 排序演算法

(以下規則皆以「遞增排序」為例。)

1. 插入排序法:

① 將最前端的數當作「已排序」。

② 將未排序的第 1 個數,由已排序數值的末端逐一向前比較,並插入適當位置。

③ 重覆②,直到完成所有數的排序。

2. 選擇排序法:

① 在未排序的數值中找到最小值,和未排序的第 1 個數交換,完成一個數的排序。

② 重複①,直到完成所有數的排序。

3. 氣泡排序法:

① 在未排序的數值中,將最後一個數設為「比較位置」,並和前方相鄰的數比較,較小 的數排前面。

② 將步驟①中較小的數,設為新的「比較位置」,再與前方的數比較、交換,當最小的 數移動到最前面,完成一輪掃描。

③ 重複①、②,依次完成所有數的排序。

1-2 程式實作—氣泡排序法 任務要求

1. 使用檔案 1-2-1.sb3 撰寫程式。

2. 完成 的程式,按下 ,程式要將 紙牌清單 中的數字由小至大排序。

問題思考

Q 1. 兩數的比較與交換:(遞增排序)

(1) 交換時機為何?

(2) 如何將清單內的兩個數互換?

Q 2. 完成氣泡排序的演算法:

(1) 共要掃描幾輪?如何設定與控制?

(2) 每一輪掃描時,分別要比較幾次?如何設定與控制?

(3) 如何設定每次要比較的位置?

36

資訊科技篇

p004-039_ch1.indd 36

p004-039_ch1.indd 36 2020/10/2 下午 04:27:022020/10/2 下午 04:27:02

(34)

解題分析

Q 1. 兩數的比較與交換:(遞增排序)

(1) 交換時機:當後數<前數時,兩數交換。

(2) 為了避免資料在交換時被覆蓋,我們要設定 一個變數暫存用來存放資料。

① 將資料 2 的資料複製到暫存中。

② 複製資料 1 的資料到資料 2 中。

③ 複製暫存的資料到資料 1 中。

Q 2. 完成氣泡排序的演算法:

(假設有n 個數要進行排序)

(1) 掃描輪數:

① 共掃描 n - 1 輪。

② 利用變數 來記錄輪數。

(2) 各輪的比較次數:

次數= n -輪數:

第1 輪:n - 1 次 第2 輪:n - 2 次 第3 輪:n - 3 次

第n - 1 輪:1 次 (3) 比較的位置:

① 每輪都從清單末端開始。

② 利用變數 來記錄比較位置。

③ 每次比較完,往前移動一位,繼續進 行比較。

初始 狀態

資料1 資料2 暫存

A B

A B B

A A B

B A B

【程式規畫】

掃描

【清單長度-1】

用變數 記錄現在是第幾輪:

1 開始,逐輪加 1

(執行完一整輪的比較之後)

進行下一輪掃描: 的值加1

比較

【清單長度-第幾輪】

用變數 記錄要比較的位置:

每輪 都從「清單長度」開始

(執行完一次比較之後)

進行下一次比較: 的值減 1 (比較的位置往前移動一位)

函式:比較與交換

若後數<前數,兩數交換

1

  序

第1章 排序

37

p004-039_ch1.indd 37

p004-039_ch1.indd 37 2020/10/2 下午 04:27:032020/10/2 下午 04:27:03

(35)

or

S ting

科技廣角

演算法是解決問題的辦法,也就是完成某項任務的 步驟,因每個人的思考方式不同,針對同一個問題,可

能會設計出不同的演算法。在本章中,我們介紹三種排序演算法,它們分別適用 於不同的情境中,在資訊科學的領域中,還有許多有趣或著名的演算法。

猴子排序是資訊科學領域中非常特別 的排序演算法,但特別的原因在於「它一 點都不實用」,其原理就像是一隻猴子將 一堆卡片隨意拋起,落下後檢查卡片是否 已排序好,若沒排好就再拋一次,完全是 聽天由命的演算法。

雖然猴子排序一點都不實用、幾乎派不上用場,但它的存在也說明了每種想 法都有可能實現,這也正是創造演算法的必要條件之一。

1 什麼都可能-猴子排序

2 創新成經典-合併排序

西元 1945 年,合併排序法由「電腦之父」馮紐曼提出,

採用「分而治之法」,將一個複雜的問題分成更多相似且更 小的子問題,並暫時存到額外的空間裡,直到子問題解決 後,再將處理好的子問題合併回原空間,就能解出答案。

合併排序的出現,大幅減少了氣泡排序一一比對所耗費 的執行時間,合併排序也成為最常被使用、或加以改進的通 用排序法之一。

創造自己的

排序演算法

馮紐曼(John von Neumann,西元1903 年~1957年)

38

資訊科技篇

p004-039_ch1.indd 38

p004-039_ch1.indd 38 2020/10/2 下午 04:27:052020/10/2 下午 04:27:05

(36)

的機器翻譯計畫。在當時,俄文與英文對應的詞彙列表是依 照字母順序儲存在磁帶上,在翻譯時須將句子內的單字先依 字母順序排列,以便讀取一次磁帶就翻譯完全部的單字。霍 爾嘗試過當時所有的排序法來排序單字,都覺得太慢了,為 此他設計出了「快速排序」,大幅提高了翻譯的效率。

快速排序是另一個採用分而治之法、並被廣為使 用的代表性演算法,與合併排序不同的是,快速排序 可以在原地執行演算法,無須額外的記憶體空間,相 當適合用於記憶體空間有限時的運算。霍爾也因此獲 得有「電腦界諾貝爾獎」之稱的圖靈獎肯定。

西元 1998 年,G oogle 的創辦人之一賴利佩吉發表了網 頁排序的演算法,涵蓋 G oogle 搜尋引擎初期的技術內容,

例如:利用連結到某網站的超連結數量,以及網站被造訪的 頻率、停留時間等,作為網站評分的依據,再以此進行排名,

以準確列出最有可能的搜尋結果。

網頁排序的成功,讓 G oogle 在成立短短 3 個月內,躍 身為百大網站之一;現在我們上網搜尋時,能在數億筆網頁 中,快速且精確找到符合的網頁,也要感謝網頁排序的誕生。

每種排序演算法,目的雖然都是要排好順序,但過程中因應不同情境或需求,也 發展出許多不同的演算法,每種方法都是獨一無二的創意,在生活中不妨觀察有什麼 需要排序的問題,你也可以試著發展出自己的排序演算法。

4 生活隨處見-網頁排序

東尼霍爾(Tony Hoare,

西元1934年~)

賴利佩吉(Larry Page,

西元1973年~)

第1章 科技廣角

39

p004-039_ch1.indd 39

p004-039_ch1.indd 39 2020/10/2 下午 04:27:072020/10/2 下午 04:27:07

參考文獻

相關文件

1.近年來國民生活水準不斷的提昇,美容業蓬勃發展,政府為提昇美容從業人員專

1.若無相關國際標準,或擬議之技術性法規及符合性評估程序所

• 這篇文章只涵蓋這塊有趣的領域之一小部分。 如果你想多學些, 可用 google 搜尋下列關鍵 字 : prime number, prime number theorem, Fermat primes, Mersenne primes, Sophie

。當時人們發現的引擎在啟動後,機器會去尋找適合

sort 函式可將一組資料排序成遞增 (ascending order) 或 遞減順序 (descending order)。. 如果這組資料是一個行或列向量,整組資料會進行排序。

直線方程式從 11 年級挪到了 10 年級,看似恢復了 95 暫綱的安排,但是本條目的設計 內涵還是比較接近

哈瑞斯女士說,假如 Google 光是簡單地撤 出中國,外界會認為他們拋棄中國用戶; G oogle 是盡了很大的努力,來保證搜索內容

姑媽今天開立了一個為期五年的紐西蘭元定期存款。 本金為 10,000 紐元,以複利息計算,年利率為