📶 U6 排序・知識點 K18

平行清單連動處理

讓姓名和分數兩個清單一起移動

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

1學習目標

  • 知道兩個清單的同一個位置代表同一筆資料(平行清單)。
  • 會用一個清單找出位置,再用這個位置到另一個清單取資料。
  • 會讓兩個清單同步交換,資料才不會配錯。
  • 會完成連動選擇排序的第一回合。

2概念說明

全班的資料常常分成好幾個清單存放:姓名一個清單、分數一個清單。只要同一個位置,就是同一位同學:

位置12345
姓名清單AmyBobCarlDoraEric
分數清單8090708560

Bob 在第 2 個位置,他的分數就在分數清單的第 2 個位置:90。

這種「平行清單」有兩個重要的使用規則:

  1. 用位置當橋樑:在分數清單找到最高分在第 2 個位置,就到姓名清單拿第 2 項,得到 Bob。
  2. 要動一起動:交換分數清單的第 1、2 項時,姓名清單的第 1、2 項也一定要交換,不然 Amy 就會拿到 Bob 的分數。
📌 讀入資料的方法

這個知識點的題目,第一行是 5 個姓名、第二行是 5 個分數。用兩個「重複 5 次」分別讀入,添加到兩個清單。

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

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

示範題 1

找出最高分與最低分學生的位置與姓名

L2|進階seclect-008
在整理成績資料時,小華發現每位學生的姓名與分數 是分別存放在兩個清單中,但相同位置代表同一位學生。 現在老師希望小華一次找出: 最高分所在的位置與姓名 最低分所在的位置與姓名 以便後續進行成績分析與排序。 請你寫一個程式,從分數清單中找出最高分與最低分, 並輸出它們所在的位置與對應的學生姓名。 注意事項: 1. 清單位置由 1 開始計算。 2. 若最高分或最低分出現多次,請輸出最前面出現的那一筆資料
輸入
第1行:5 個姓名(以空格隔開)。 第2行:5 個整數,代表對應的分數(以空格隔開)。
輸出
輸出一行資料,依序輸出: 最高分位置 最高分姓名 最低分位置 最低分姓名(以空格隔開)。
範例1
輸入
Amy Bob Carl Dora Eric
80 90 70 85 60
輸出
2 Bob 5 Eric
範例2
輸入
Tom May John Lily Ken
88 92 92 75 60
輸出
2 May 5 Ken
第 1 步:讀題,找出輸入和輸出
  • 輸入:第一行 5 個姓名,第二行 5 個分數。
  • 輸出:最高分的位置和姓名、最低分的位置和姓名。
第 2 步:把問題拆成步驟

在分數清單上用 K10 的方法記住最高分、最低分的位置;最後再用位置到姓名清單取名字:

(讀入 姓名清單、分數清單)
最高分 設為 −1000000,最低分 設為 1000000
i 從 1 數到 5:
    如果 分數的第 i 項 > 最高分:
        最高分 設為 分數的第 i 項,最高位置 設為 i
    如果 分數的第 i 項 < 最低分:
        最低分 設為 分數的第 i 項,最低位置 設為 i
說出 最高位置、姓名的第 最高位置 項、最低位置、姓名的第 最低位置 項
第 3 步:用範例走一次

分數[80, 90, 70, 85, 60]:最高分 90 在第 2 個位置 → 姓名第 2 項是 Bob;最低分 60 在第 5 個位置 → 姓名第 5 項是 Eric。輸出「2 Bob 5 Eric」。

第 4 步:對照範例答案

按「載入範例」,範例答案在更新最高分的同時,就把姓名一起存起來。你也可以像上面一樣,最後再用位置去姓名清單拿,兩種都可以。

⚠️ 常見錯誤
  • 比較時用 ≥ 或 ≤:最高分出現兩次時,題目要最前面那一個,所以要用「>」「<」。
示範題 2

連動選擇排序第一回合

L2|進階seclect-009
小華已經學會如何在成績清單中找出最高分與最低分的位置, 現在老師要他進一步練習連動清單的排序操作。 桌上有兩個清單: 學生姓名清單 對應的分數清單 相同位置代表同一位學生。 請你完成選擇排序的第一回合: 從所有學生中找出分數最高的學生, 並將這位學生與第 1 個位置的資料進行交換。 交換時,姓名與分數必須一起交換, 其餘位置的順序保持不變。 注意事項: 1. 只進行第一回合,不需完成整個排序。 2. 若最高分出現多次,請選擇最前面出現的那一筆資料
輸入
第1行:5 個姓名(以空格隔開)。 第2行:5 個整數,代表對應的分數(以空格隔開)。
輸出
第1行:第一回合完成後的 5 個姓名(以空格隔開)。 第2行:第一回合完成後的 5 個分數(以空格隔開)。
範例1
輸入
Amy Bob Carl Dora Eric
80 90 70 85 60
輸出
Bob Amy Carl Dora Eric
90 80 70 85 60
範例2
輸入
Tom May John Lily Ken
95 88 92 75 60
輸出
Tom May John Lily Ken
95 88 92 75 60
第 1 步:和 K17 的選擇排序差在哪裡?

這題是 K17 選擇排序第一回合的連動版,而且要找的是最高分(由高到低排):

  1. 在分數清單找出最高分的位置。
  2. 分數清單的第 1 項和該位置交換。
  3. 姓名清單也做一模一樣的交換。
(讀入 姓名清單、分數清單)
最高分 設為 分數的第 1 項,位置 設為 1
i 從 2 數到 5:
    如果 分數的第 i 項 > 最高分:
        最高分 設為 分數的第 i 項,位置 設為 i
交換 姓名清單 的第 1 項 和 第 位置 項
交換 分數清單 的第 1 項 和 第 位置 項
說出 姓名清單,再說出 分數清單
第 2 步:用範例走一次

最高分 90 在第 2 個位置:姓名的 Amy、Bob 交換,分數的 80、90 也交換。

位置12345
姓名清單BobAmyCarlDoraEric
分數清單9080708560
第 3 步:對照範例答案

按「載入範例」,看看兩組交換各用了一個暫存變數(暫存、暫存2),分別處理姓名和分數。

⚠️ 常見錯誤
  • 只交換分數:分數排好了,但姓名還在原位,Amy 會變成 90 分。

4練習題(1 題)

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

雙卡同步交換

L2|進階seclect-007
這題多了什麼:把 K16 的清單交換做兩次:姓名清單交換第 P、Q 項,分數清單也交換第 P、Q 項。

注意輸入格式:姓名、分數、位置這三行前面,各有一個數字(5、5、2)告訴你接下來有幾筆資料。先讀這個數字,再用「重複」讀入對應的筆數,這也是很多題目常見的輸入方式。

看題目內容
在資訊課中,老師準備了兩排卡片, 第一排是學生姓名,第二排是對應的分數。 每一個位置上的姓名與分數是一組資料,必須一起行動。 老師指定兩個位置,小華需要把這兩個位置上的資料進行交換。 交換時,姓名與分數都必須一起交換,其他位置保持不變。 請你寫一個程式,完成指定位置的「連動清單交換」任務
輸入
第1行:一個整數 5,代表接下來有 5 個姓名。 第2行:5 個姓名(以空格隔開)。 第3行:一個整數 5,代表接下來有 5 個分數。 第4行:5 個整數,代表對應的分數(以空格隔開)。 第5行:一個整數 2,代表接下來有 2 個位置。 第6行:兩個整數 P、Q,代表要交換的位置(1 ≤ P, Q ≤ 5)。
輸出
第1行:交換完成後的 5 個姓名(以空格隔開)。 第2行:交換完成後的 5 個分數(以空格隔開)。
範例1
輸入
5
Amy Bob Carl Dora Eric
5
80 90 70 85 60
2
2 4
輸出
Amy Dora Carl Bob Eric
80 85 70 90 60
範例2
輸入
5
Tom May John Lily Ken
5
75 88 92 60 85
2
1 5
輸出
Ken May John Lily Tom
85 88 92 60 75
💡 需要提示嗎?
姓名清單和分數清單的同一個位置代表同一個人,兩個清單要做完全一樣的交換。輸入的第 1、3、5 行是筆數(5、5、2),記得先讀掉,再讀姓名、分數和位置。

5延伸挑戰(2 題)

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

🚀 完整雙清單排序 L3|挑戰
挑戰重點:把示範 seclect-009 的一回合重複做:第 i 回合(i 從 1 到 4)從第 i 個位置找到最後,找出最高分的位置,姓名和分數一起和第 i 個位置交換。
小華已經完成「連動選擇排序第一回合」的練習, 現在老師希望他能夠完成完整的連動排序任務。 桌上有兩個清單: 學生姓名清單 對應的分數清單 相同位置代表同一位學生。 請你使用選擇排序法,依照分數由高到低的順序, 將所有學生進行排序。 排序時必須注意: 比較時只比較「分數」 交換時「姓名與分數必須一起交換」 不可使用任何排序相關的積木或指令。 注意事項: 1. 若分數相同,學生的相對順序不限。 2. 必須完成整個排序流程
輸入
第1行:5 個姓名(以空格隔開)。 第2行:5 個整數,代表對應的分數(以空格隔開)。
輸出
第1行:排序完成後的 5 個姓名(以空格隔開)。 第2行:排序完成後的 5 個分數(以空格隔開)。
範例1
輸入
Amy Bob Carl Dora Eric
80 90 70 85 60
輸出
Bob Dora Amy Carl Eric
90 85 80 70 60
範例2
輸入
Tom May John Lily Ken
95 88 92 75 60
輸出
Tom John May Lily Ken
95 92 88 75 60
💡 需要提示嗎?
把上一題的「第一回合」重複做完;每次交換分數時,姓名也要一起交換。
🚀 排序結果應用-成績排行榜 L3|挑戰
挑戰重點:先完成上一題的連動排序,再用迴圈依序說出「名次 姓名 分數」,名次就是迴圈的 i。
小華已經完成「完整雙清單排序」,並且將學生依照分數由高到低 排序完成。 現在老師希望小華能夠應用排序後的結果, 製作一份簡單的成績排行榜。 請你寫一個程式,完成以下任務: 先依照分數由高到低排序學生資料 再依排序後的結果,輸出每位學生的名次、姓名與分數 相同位置的姓名與分數必須保持連動。 注意事項: 1. 名次從 1 開始編號。 2. 若分數相同,名次仍依排序後的順序編號即可。 3. 不可使用任何排序相關的積木或指令
輸入
第1行:5 個姓名(以空格隔開)。 第2行:5 個整數,代表對應的分數(以空格隔開)。
輸出
輸出 5 行,每一行依序輸出: 名次 姓名 分數(以空格隔開)。
範例1
輸入
Amy Bob Carl Dora Eric
80 90 70 85 60
輸出
1 Bob 90
2 Dora 85
3 Amy 80
4 Carl 70
5 Eric 60
範例2
輸入
Tom May John Lily Ken
95 88 92 75 60
輸出
1 Tom 95
2 John 92
3 May 88
4 Lily 75
5 Ken 60
💡 需要提示嗎?
先完成連動排序,再依序輸出名次、姓名、分數。

6自我檢核

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

  • 我知道平行清單的同一個位置代表同一筆資料。
  • 我會在一個清單找出位置,再到另一個清單取出對應的資料。
  • 我會讓兩個清單做完全一樣的交換。
  • 我能說出連動選擇排序和一般選擇排序差在哪裡。