1什麼是排序法
排序,就是把一堆雜亂的資料,依照某個規則(由小到大、由大到小)重新排好順序。這聽起來很簡單——你自己整理撲克牌、排隊時比身高,早就會排序了。但當你要寫程式叫電腦幫你排序時,問題就不一樣了:電腦一次只能比較兩個數字、只能做一個動作,它不像人一樣「看一眼就知道誰最大」。所以你要做的事,是把「排序」這個你腦中直覺就會做的事,拆解成電腦看得懂的一步一步的比較和交換動作。
這是你在程式設計裡第一次真正練習「設計一段有步驟的邏輯」,而不是「套用一個現成的積木」。排序法也是資訊科學裡最經典的入門演算法主題之一:同一個「把資料排好」的目標,可以用不同的方法達成,而不同方法在「怎麼比較、怎麼交換」上會有清楚的差異。學會分辨這些差異,是你以後學任何演算法的基本功。
排序也會不斷在後面出現:找中位數、找第K名、要把資料做成排行榜……這些問題的第一步幾乎都是「先排序」。
2核心概念,依課程題目的順序拆解
1
交換兩個值,一定要用「暫存變數」
你可能會直覺地想寫:
A 設為 B B 設為 A
這是錯的。 執行第一步之後,A 的值已經被 B 蓋掉了,A 原本的值永遠消失了——所以第二步「B 設為 A」,其實是設成 B 原本自己的值,等於什麼都沒換到。
正確做法要多借一個變數(暫存),先把 A 原本的值存起來再開始覆蓋:
暫存 = A A = B B = 暫存
暫存 = A
(先備份 A)
(先備份 A)
→
A = B
(A 被覆蓋沒關係)
(A 被覆蓋沒關係)
→
B = 暫存
(把備份的 A 給 B)
(把備份的 A 給 B)
🆕 補充圖解:三個步驟缺一不可,就像交換兩杯不同顏色的水,一定要先借一個空杯子新增
SWAP交換函數(seclect-001)兩數交換成升冪(SORT01-001)
⚠️ 常見誤區
忘記借用暫存變數,直接 A=B、B=A,結果兩個變數變成同一個值。這是排序法最容易犯的第一個錯——因為後面泡泡排序、選擇排序的每一次「交換」,做的都是這三行動作,這裡沒學會,後面一定會卡住。2
泡泡排序——一輪一輪,把最大的往後推
你要做的事:從清單第一個位置開始,依序比較「這個位置」跟「下一個位置」的數字,如果順序反了(前面比後面大)就交換。當你這樣掃完一整輪,你會發現一件事:這一輪掃過的範圍裡最大的數字,一定會被推到最右邊(因為它每次比較都贏,就一直被往後交換)。只要重複掃描 N-1 輪,整個清單就會排好。
練習題目(按順序做)
- 「相鄰交換一次」(SORT01-003):只做一輪掃描,親眼看到掃一輪之後最大值自己跑到最右邊——先搞懂這個現象,再往下做
- 「泡泡排序升冪」(SORT01-004):把「掃一輪」包進外層迴圈,重複掃描直到完全排好
- 「泡泡排序降冪」:把比較的方向反過來(改成前面比後面小才交換)
自己動手跑一次(以 5 1 4 2 3 為例,看看第一輪掃描發生了什麼)
5
1
4
2
3
比較(5,1):5>1,交換
↓
1
5
4
2
3
比較(5,4):5>4,交換
↓
1
4
5
2
3
比較(5,2):5>2,交換
↓
1
4
2
5
3
比較(5,3):5>3,交換
↓
1
4
2
3
5
5 已經被一輪一輪推到最右邊了!🆕 圖解為補充內容新增
⚠️ 常見誤區
只掃一輪就以為排序完成了,忘記外層還要重複掃描 N-1 輪。這正是題組故意先讓你做「相鄰交換一次」的原因——先確認你真的看懂「一輪」的效果,再進到完整的重複迴圈。3
選擇排序——先找出這一輪最小的在哪裡,再換過去一次就好
選擇排序跟泡泡排序的想法不一樣:不是每比較一次就交換一次,而是先在「還沒排好的範圍」裡,找出最小值所在的位置,等你確定找到了,這一輪只交換一次(把最小值換到這一輪的最前面)。
練習題目(按順序做)
- 「清單最大最小值的位置」(seclect-003):先單獨練習「找出最小值所在的位置(索引),不是找最小值本身」——這是選擇排序最容易搞混的地方
- 「選擇排序第一回合」:只做第一輪「找最小值位置+交換一次」
- 「完整選擇排序」:把第一回合包進外層迴圈,跑完整個清單
- 「三數升冪排序」(SORT01-002):N=3 的簡化版選擇排序,可以先做這一題暖身
| 泡泡排序 | 選擇排序 | |
|---|---|---|
| 什麼時候交換 | 每次比較「順序不對」就馬上交換 | 一輪只交換一次(找到最小值位置後才換) |
| 一輪交換幾次 | 可能很多次 | 固定1次 |
| 怎麼找最小值 | 沒有特別去「找位置」,是交換動作順便造成的結果 | 明確先找出位置,再用這個位置去交換 |
⚠️ 常見誤區
把兩種排序法的交換時機搞混——寫選擇排序時卻寫成「每次比較就交換」,變成四不像。做題目前先問自己:這一題是要「邊比較邊交換」還是「先找位置、最後只換一次」?4
資料有多個欄位時,排序要「連動」——不能只排一個清單
真實資料常常是「姓名+分數」這種一筆資料、多個清單的組合,同一個位置的姓名和分數其實是綁在一起的一組資料。如果你只排序了分數清單,姓名清單卻沒有跟著動,姓名跟分數的對應關係就會全部對不起來——這是排序法應用到真實資料時最常出的錯。
分數:
72
95
60
姓名(同一組位置要跟著換):
小華
小美
小明
🆕 補充圖解:交換分數清單的位置P、Q時,姓名清單也要用同一組P、Q交換一次新增
練習題目(按順序做,M1-08)
- 「卡片位置交換清單版」(seclect-002):先練習在清單裡「指定兩個位置」做交換,把概念1(暫存變數交換)用在清單索引上
- 「雙卡同步交換」(seclect-007):兩個清單(姓名清單、分數清單)用同一組位置P、Q各自交換一次
- 「找出最高分與最低分學生的位置與姓名」(seclect-008):在分數清單裡找到最大/最小值的位置後,用同一個位置去姓名清單取出對應的名字
- 「連動選擇排序第一回合」「完整雙清單排序」:把概念3的選擇排序套用在雙清單上
- 「排序結果應用-成績排行榜」「多清單整合實戰-學生資料分析」:綜合應用,排序完直接產出報表
⚠️ 常見誤區
只寫了排序分數清單的邏輯,忘記姓名清單也要用同一組位置一起交換。做這一類題目時,養成習慣提醒自己:「這裡交換了一個清單,另一個清單是不是也要用同一個位置做一次?」5
排好序之後,很多統計問題直接用位置就能回答
清單一旦排好順序,很多問題就變得很簡單:
- 找中位數:排序後直接拿正中間那個位置
- 找第K小:排序後直接拿第K個位置
- 去掉最高最低後的平均:排序後跳過第一個和最後一個,再加總平均
排序後的中間值排序後第K小排序後去除最高最低
這一組題目不需要新的演算法概念——排序你已經在概念2、3學過了——重點是養成「先排序、再用位置取值」這個固定的解題套路。
3建議練習順序對照表
| 順序 | 概念 | 題目 | 課程 |
|---|---|---|---|
| 1 | 暫存變數交換 | SWAP交換函數(seclect-001) | M1-07 |
| 2 | 暫存變數交換(if-else版) | 兩數交換成升冪(SORT01-001) | M1-07 |
| 3 | 選擇排序暖身 | 三數升冪排序(SORT01-002) | M1-07 |
| 4 | 泡泡排序:一輪掃描 | 相鄰交換一次(SORT01-003) | M1-07 |
| 5 | 泡泡排序:完整 | 泡泡排序升冪/降冪(SORT01-004起) | M1-07 |
| 6 | 選擇排序:找位置 | 清單最大最小值的位置(seclect-003) | M1-08 |
| 7 | 選擇排序:第一回合/完整 | 選擇排序第一回合/完整選擇排序 | M1-07 |
| 8 | 清單指定位置交換 | 卡片位置交換清單版(seclect-002) | M1-08 |
| 9 | 雙清單同步交換 | 雙卡同步交換(seclect-007) | M1-08 |
| 10 | 雙清單找值配對 | 找出最高分與最低分學生的位置與姓名(seclect-008) | M1-08 |
| 11 | 連動排序 | 連動選擇排序第一回合/完整雙清單排序 | M1-08 |
| 12 | 綜合應用 | 排序結果應用-成績排行榜/多清單整合實戰 | M1-08 |
| 13 | 排序後應用 | 排序後的中間值/第K小/去除最高最低 | M1-07 |
🆕 本頁新增內容說明
以下視覺元素為 Cowork 潤飾時新增,MD 正本中沒有:① 暫存變數交換三步驟圖解 ② 雙清單連動交換示意圖。原MD中泡泡排序的文字版逐步示範,已改繪成本頁的格子圖(內容數值相同,僅呈現方式改變)。若確認保留,建議之後補進 MD 正本。