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
解題分析
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
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