📶 U6 排序・知識點 K16

資料交換

用暫存變數交換兩個變數或清單中的兩個位置

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

1學習目標

  • 會用暫存變數交換兩個變數的值。
  • 會判斷「需要交換才交換」。
  • 會交換清單裡指定的兩個位置。

2概念說明

想像你左手拿紅茶、右手拿奶茶,要把兩杯飲料交換到另一隻手。直接換一定會打翻,你需要一個空杯子(桌子)先放一杯:

① 暫存 ← A
→
② A ← B
→
③ B ← 暫存
交換 A 和 B 的三個步驟,順序不能亂

用 A = 8、B = 3 走一次:

步驟暫存AB
開始-83
① 暫存 設為 A883
② A 設為 B833
③ B 設為 暫存838
⚠️ 為什麼一定要暫存變數?

如果直接寫「A 設為 B」再寫「B 設為 A」:第一步做完 A 已經變成 3,原本的 8 就不見了,第二步 B 只會拿到 3,結果兩個都是 3。

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

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

示範題

SWAP交換函數

L1|基礎seclect-001
在學習排序之前,小安先練習一個重要的小任務。 桌上有兩張數字卡片,依序放在第 1 個位置與第 2 個位置。 小安希望讓「數字小的卡片在前面,數字大的卡片在後面」。 如果前面的數字比較大,就需要把兩張卡片的位置交換; 如果順序本來就正確,則不需要交換。 請你寫一個程式,判斷是否需要交換,並輸出交換後的結果。 (提示:交換時需要使用暫存變數)
輸入
一次輸入兩個整數 A、B(以空格隔開),代表目前卡片的順序。
輸出
輸出兩個整數,代表調整後由小到大的順序(以空格隔開)。
範例1
輸入
8 3
輸出
3 8
範例2
輸入
4 9
輸出
4 9
第 1 步:讀題,找出輸入和輸出
  • 輸入:兩個整數 A、B。
  • 輸出:由小到大的兩個數。前面比較大才需要交換。
第 2 步:把問題拆成步驟
詢問並等待 → A
詢問並等待 → B
如果 A > B:
    暫存 設為 A
    A 設為 B
    B 設為 暫存
說出 A、空白、B
第 3 步:用範例走一次
  • 輸入 8 3:A > B 成立,交換後 A = 3、B = 8,輸出「3 8」。
  • 輸入 2 9:A > B 不成立,不交換,輸出「2 9」。
第 4 步:對照範例答案

按「載入範例」,看看交換的三個積木都放在「如果」裡面,而且順序是:暫存 ← A、A ← B、B ← 暫存。

4練習題(2 題)

照順序完成這些題目。寫完之後,可以在平台上按「載入範例」和自己的寫法比較。

三數升冪排序

L2|進階SORT01-002
這題多了什麼:三個數字要排好,可以用「相鄰比較、需要就交換」:先比 A 和 B,再比 B 和 C,這時最大的會到最後面;再比一次 A 和 B,就全部排好了。每次比較都用示範的交換方法。這其實就是 K17 會學到的泡泡排序,範例答案也是這樣寫的。
看題目內容
給定三個整數,請使用泡泡排序的方法將它們由小到大輸出:比較相鄰的兩個數,左邊比較大就交換(第 1、2 個比較,再第 2、3 個比較,最後再比較一次第 1、2 個)。
輸入
輸入三個整數 A、B、C。
輸出
輸出三個整數,由小到大排列,中間以空白分隔。
範例1
輸入
9 2 5
輸出
2 5 9
💡 需要提示嗎?
比較第 1、2 個,必要時交換;再比較第 2、3 個……想想總共需要比較幾次才能保證排好。

卡片位置交換清單版

L2|進階seclect-002
這題多了什麼:交換的方法完全一樣,只是對象從兩個變數,換成清單的第 P 項和第 Q 項:暫存 ← 第 P 項、第 P 項 ← 第 Q 項、第 Q 項 ← 暫存。注意輸入的格式:第 3 行的 M 是固定的 2(代表接下來有兩個位置),要先讀掉它,再讀 P 和 Q。Blockly 用「自清單…設定 # P 為…」,Scratch 用「替換…的第 P 項為…」。
看題目內容
小安已經學會「兩個變數的交換」,現在他拿到一排固定 5 張的數字卡片, 卡片依序放在第 1 到第 5 個位置中。 老師指定清單中的兩個位置,小安需要把這兩個位置上的數字卡片進行交換, 其他位置的卡片保持不變。 請你寫一個程式,完成指定「清單位址」的資料交換。 (提示:交換時仍然需要使用暫存變數)
輸入
第1行:輸入一個整數N,N固定為5 第2行:輸入5 個整數,代表清單中第 1 到第 5 個位置的數字(以空格隔開)。 第3行:輸入一個整數M,M固定為2 第4行:輸入兩個整數 P、Q,代表要交換的清單位置(1 ≤ P,Q ≤ 5)。
輸出
輸出 5 個整數,代表交換完成後清單中的數字順序(以空格隔開)。
範例1
輸入
5
8 3 5 1 6
2
2 4
輸出
8 1 5 3 6
範例2
輸入
5
4 7 2 9 5
2
1 5
輸出
5 7 2 9 4
💡 需要提示嗎?
交換的方法和兩個變數交換相同,只是對象換成清單的第 A 項和第 B 項。

5自我檢核

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

  • 我能說明為什麼交換一定要用暫存變數。
  • 我會照正確順序寫出交換的三個步驟。
  • 我會只在需要的時候(例如前面比較大)才交換。
  • 我會交換清單中指定的兩個位置。