📶 U6 排序・知識點 K17

排序演算法

理解泡泡排序和選擇排序的每一回合在做什麼

B6-02-SortAlgo
練習平台
點標題可以展開或收合

1學習目標

  • 會做泡泡排序的一回合:相鄰比較,順序不對就交換。
  • 會做選擇排序的一回合:找出最小值的位置,和最前面交換。
  • 知道兩種排序法各是由哪些學過的技巧組合而成。
  • (延伸)會把「一回合」重複做完,完成整個排序。

2概念說明

排序看起來很難,其實兩種經典方法都是前面學過的技巧組合起來的:

排序法一回合在做什麼用到的技巧
泡泡排序從左到右,相鄰兩個比較,左邊比較大就交換K11 相鄰比較 + K16 交換
選擇排序找出最小值在哪裡,把它和最前面的交換K10 記住最小值的位置 + K16 交換

泡泡排序一回合:大的數字會像泡泡一樣一路往右浮,一回合結束時,最大值一定到了最右邊。

5
1
4
2
3
↓ 5 > 1,交換
1
5
4
2
3
↓ 一路比到最後
1
4
2
3
5
泡泡排序一回合後,最大的 5 到了最右邊

選擇排序一回合:在全部資料中選出最小的,換到第 1 個位置,第 1 個位置就確定了。

📌 為什麼先練「一回合」?

完整的排序就是把一回合重複做很多次。先把一回合寫對,再加一個外層迴圈重複它,就是完整的排序法(延伸挑戰)。

3示範題:跟著一步一步做(2 題)

先讀題,再一步一步點開來看。建議每看完一步,就先自己在平台上試著寫寫看。

示範題 1

相鄰交換一次

L2|進階SORT01-003
給定 N 個整數,請從左到右檢查每一組相鄰數字。如果左邊數字大於右邊數字,就交換兩者。整個清單只掃描一次。
輸入
第一個整數為 N,接著輸入 N 個整數。保證 N 大於或等於 2。
輸出
輸出掃描一次後的 N 個整數,中間以空白分隔。
範例1
輸入
5
5 1 4 2 3
輸出
1 4 2 3 5
第 1 步:讀題,找出輸入和輸出
  • 輸入:N(至少 2),接著 N 個整數。
  • 輸出:從左到右掃描一次、需要就交換之後的 N 個數字。
第 2 步:把問題拆成步驟
(讀入 N 個數字,存進 全部數字)
i 從 1 數到 N−1:
    如果 第 i 項 > 第 i+1 項:
        交換 第 i 項 和 第 i+1 項
說出 全部數字(依序說出每一項)

迴圈只到 N−1,原因和 K11 一樣:最後一組是第 N−1 項和第 N 項。

第 3 步:用範例走一次

清單[5, 1, 4, 2, 3]:

i比較交換嗎?這一步之後的清單
15 和 1是1 5 4 2 3
25 和 4是1 4 5 2 3
35 和 2是1 4 2 5 3
45 和 3是1 4 2 3 5

輸出「1 4 2 3 5」,最大值 5 到了最右邊。

第 4 步:對照範例答案

按「載入範例」,看看交換用的是 K16 的三個步驟,只是對象換成清單的第 i 項和第 i+1 項。最後的說出可以用迴圈每一輪說出一項。

⚠️ 常見錯誤
  • 迴圈跑到 N:最後一輪會拿不存在的第 N+1 項來比。
  • 掃描超過一次:題目只要一回合,多做幾回合結果會變成完全排好,反而不對。
示範題 2

選擇排序第一回合

L2|進階seclect-004
小安正在學習「選擇排序法」,老師請他先完成第一回合的任務。 桌上有一排固定 5 個的數字,依序放在第 1 到第 5 個位置中。 請你找出這 5 個數字中最小的數字,並把它與第 1 個位置的數字交換。 注意事項: 1. 只進行「第一回合」,不需要完成整個排序。 2. 若最小值有多個,請選擇最前面出現的那一個。 3. 交換完成後,其餘位置的數字順序保持不變
輸入
第1行:輸入一個整數N,N固定為5 第2行:輸入5 個整數,代表清單中第 1 到第 5 個位置的數字(以空格隔開)。
輸出
輸出 5 個整數,代表完成「選擇排序第一回合」後的數字順序(以空格隔開)。
範例1
輸入
5
8 3 5 1 6
輸出
1 3 5 8 6
範例2
輸入
5
2 4 6 8 10
輸出
2 4 6 8 10
第 1 步:讀題,找出輸入和輸出
  • 輸入:N(固定為 5),接著 5 個整數。
  • 輸出:把最小值和第 1 個位置交換之後的 5 個數字。
第 2 步:把問題拆成步驟

先用 K10 的方法找出最小值的位置,再和第 1 項交換:

(讀入 N 個數字,存進 全部數字)
最小位置 設為 1
j 從 2 數到 N:
    如果 第 j 項 < 第 最小位置 項:
        最小位置 設為 j
交換 第 1 項 和 第 最小位置 項
說出 全部數字
第 3 步:用範例走一次

清單[8, 3, 5, 1, 6]:最小位置從 1(值 8)開始,j = 2 時 3 < 8,最小位置變 2;j = 4 時 1 < 3,最小位置變 4。最後把第 1 項(8)和第 4 項(1)交換,得到「1 3 5 8 6」。

第 4 步:對照範例答案

按「載入範例」,範例答案比較的是「第 j 項」和「第 最小位置 項」,而不是另外存一個最小值變數,兩種寫法都可以。

⚠️ 常見錯誤
  • 只記住最小值,沒記住位置:知道最小的是 1,卻不知道它在第幾格,就沒辦法交換。
  • 比較時用 ≤:最小值出現多次時要選最前面那一個,所以要用「<」。

4延伸挑戰(3 題)

核心題都會了嗎?這些題目需要把好幾個技巧組合起來,想挑戰的話可以試試看。

🚀 泡泡排序升冪 L3|挑戰
挑戰重點:把示範 SORT01-003 的「一回合」外面再包一層「重複 N−1 次」,就是完整的泡泡排序。為什麼是 N−1 回合?每一回合都會把剩下的最大值推到最右邊,N 個數字做完 N−1 回合,只剩最前面一個,自然就排好了。按「載入範例」可以看到,範例答案就是在一回合的迴圈外面多包了一層「重複」。
給定 N 個整數,請使用泡泡排序法將它們由小到大輸出:從左到右比較相鄰的兩個數字,左邊比較大就交換,這樣掃描一回合;重複 N−1 回合就能全部排好。
輸入
第一個整數為 N,接著輸入 N 個整數。
輸出
輸出由小到大排序後的 N 個整數,中間以空白分隔。
範例1
輸入
5
5 1 4 2 3
輸出
1 2 3 4 5
💡 需要提示嗎?
把「掃描一回合」重複做 N-1 次,就是完整的泡泡排序。
🚀 完整選擇排序 L3|挑戰
挑戰重點:把示範 seclect-004 的一回合重複做:第 k 回合從第 k 個位置找到最後,找出最小值的位置,和第 k 個位置交換。k 從 1 做到 N−1 就排好了。
小安已經學會如何在清單中找出最小值,並進行兩數交換。 現在老師請他完成完整的選擇排序任務。 桌上有一排固定 5 個整數,請你使用「選擇排序法」, 將這些數字由小到大排序。 選擇排序說明: 1. 從尚未排序的部分中找出最小值。 2. 將最小值與目前排序位置的數字交換。 3. 重複上述步驟,直到整個清單排序完成。 注意事項: 1. 不可使用排序相關的積木或指令。 2. 若有相同數字,排序後相對位置不限
輸入
第1行:輸入數字N,N固定為5 第2行:輸入5 個整數,代表清單中的數字(以空格隔開)。
輸出
輸出 5 個整數,代表排序完成後的結果(以空格隔開)。
範例1
輸入
5
8 3 5 1 6
輸出
1 3 5 6 8
範例2
輸入
5
2 4 6 8 10
輸出
2 4 6 8 10
💡 需要提示嗎?
第 k 回合從第 k 個位置之後找出最小值,再和第 k 個位置交換,重複到最後。
🚀 排序後的中間值 L3|挑戰
挑戰重點:先用任何一種排序法把數字由小到大排好,中間值就在第(N+1)÷ 2 個位置。例如 5 個數字,中間值是第 3 個。
給定奇數個整數,請將它們由小到大排序後,輸出中間位置的數字。位置從 1 開始計算。
輸入
第一個整數為 N,接著輸入 N 個整數。保證 N 為奇數。
輸出
輸出一個整數,代表排序後的中間值。
範例1
輸入
5
9 1 5 3 7
輸出
5
💡 需要提示嗎?
先把數字由小到大排好,中間值就在第 (N+1)/2 個位置。

5自我檢核

學完之後,檢查看看你能不能做到這些事。有做不到的,就回到上面對應的地方再看一次。

  • 我會寫出泡泡排序的一回合,並知道一回合後最大值會到最右邊。
  • 我會寫出選擇排序的一回合,並知道要先找出最小值的位置。
  • 我能說出兩種排序法各是由哪些學過的技巧組合起來的。
  • 我知道怎麼把一回合重複,變成完整的排序。