誰是整理魔法師?——用「天平遊戲」學會電腦的排序絕招( Sorting algorithm )

「排序 (Sorting)」是電腦最常做的工作之一。如果資料沒排好,電腦找東西就會變得很慢。

但是,要把幾百萬筆資料排好順序,是一件浩大的工程。

今天我們不看程式碼,我們用「看不見內容的神秘罐子」和一個「天平」,讓孩子親手感受一下,為什麼電腦科學家總是想方設法要幫電腦「省力氣」。

第一階段:電腦的視力限制

首先,我們要模擬電腦的限制:它不能像人眼一樣一眼看穿誰最重,它一次只能比較兩個東西。

  1. 任務設定:
    • 準備 8 個外觀一模一樣的容器(例如貼滿膠帶的牛奶盒或底片罐),分別將裡面裝進不同量的水或沙子。
    • 關鍵道具: 一個天平(可以用衣架自製,或只是用雙手當天平)。
    • 規則: 「你的任務是把這 8 個罐子,從最輕排到最重。但是你不能偷看裡面,一次只能拿兩個罐子放在天平上比。」。
  2. 穩紮穩打的直覺 (Selection Sort):
    • 孩子通常會怎麼做?他們會隨便抓兩個比,把輕的留著,再拿去跟下一個比,直到找出「全場最輕」的那一個,把它放到最左邊。
    • 然後,在剩下的罐子裡,再重複一次,找出第二輕的。
  3. 正向引導思考 (Engineer Mindset):
    • 這種「每次挑出一個最輕的」方法,叫做「選擇排序法 (Selection Sort)」。
    • 家長提問: 「這是一個非常穩健的方法!不過我們來算算看,剛剛為了排好這 8 個罐子,天平大概動了 28 次。想像一下,如果今天是全校 1000 個學生的資料,你覺得電腦會不會希望能有一種『捷徑』,讓它可以早點把工作做完去休息?」。

第二階段:電腦高手的省力絕招

現在,我們要介紹一招電腦高手的省力絕招,叫做「快速排序法 (Quicksort)」。這是一種運用「分治法 (Divide and Conquer)」的魔法。

  1. 改變策略:
    • 「這次我們來幫電腦省點電。我們試著不要一個一個挑。」
    • 規則:
      1. 從這堆罐子裡隨機抓一個出來,放在桌子中間。我們叫它「隊長 (Pivot)」(或基準點)。
      2. 剩下的罐子,每一個都來跟隊長比一下。
      3. 比隊長輕的: 請去左邊集合。
      4. 比隊長重的: 請去右邊集合。
  2. 視覺化效果:
    • 當孩子比完一輪後,桌子上會變成三群:左邊(輕)、中間(隊長)、右邊(重)。
    • 關鍵提問: 「看!現在左邊那些輕的罐子,還需要花力氣去跟右邊那些重的罐子比嗎?」
    • 答案: 「不用!因為左邊一定比右邊輕。我們成功把一個大麻煩,切成兩個小麻煩了!」

第三階段:速度的對決

  1. 繼續切分 (Recursion):
    • 現在專注處理左邊那一小堆。再選一個新隊長,再分一次(輕的左邊、重的右邊)。
    • 右邊那一堆也做一樣的事。
    • 一直重複同樣的動作,直到每一堆只剩下一個罐子為止。
  2. 比較次數:
    • 讓孩子算算看。用剛剛的第一種方法(選擇排序)可能要比 28 次。
    • 用這個「選隊長、切兩半」的方法(快速排序),運氣好的話只要 14 次就能排好!。
    • 結論: 「哇!我們少做了一半的工作!如果是一百萬筆資料,這個方法會快上 20000 倍,這能幫電腦省下非常多的電力和時間!」。

第四階段:概念連結 (Concept Connection)

為什麼要學這麼多種方法?

  • 生活譬喻:
    • 選擇排序 (Selection Sort): 就像你在玩撲克牌,手上的牌很少時,你習慣一張一張抽出來插到正確位置,這時候用簡單的方法反而方便。
    • 快速排序 (Quick Sort): 就像處理全校的考卷,數量非常龐大時,我們先把考卷分成「及格」和「不及格」兩大堆,再分別處理,這樣效率最高。
  • 電腦的考量:
    • 電腦科學家在乎的不只是「做完」,而是「有效率地做完」。選擇好的演算法,可以讓原本要跑 5 小時的程式,變成 1 秒鐘就跑完。

第五階段:除錯與思考 (Debug & Challenge)

運氣也是實力的一種?

這一步是為了引導批判性思考。

  • 提問: 「快速排序法看起來無敵快,但我們來當個『測試員』。有沒有什麼情況下,這個方法會失靈?」
  • 實驗: 「如果你運氣超級特別,每次隨手抓的『隊長』剛好都是最輕的那一個,會發生什麼事?」
  • 發現: 所有的罐子都會跑去右邊,左邊空空的。這樣就沒有達到「切一半」的效果了!
  • 結論: 原來,如果運氣太極端,快速排序法可能會變得跟第一種方法一樣慢。這就是為什麼電腦科學很有趣,永遠有新的挑戰等著我們解決。

教學觀察重點表 (Clinical Interview Guide)

這張表幫助您使用正向語氣來引導孩子思考。

觀察點❌ 較無效的反應 (負面/糾錯)✅ 較有效的引導 (正向/啟發)
當孩子覺得第一種方法很慢時「對啊,這樣做很累吧?手很痠對不對?」「這是一個很棒的發現!你注意到了重複的動作很多。如果你是設計電腦的人,你會想發明什麼新規則來讓工作變輕鬆?
比較不同排序法時「快速排序法比較好,選擇排序法很爛。」「每一種方法都有它的強項。如果你只有 3 個罐子要排,你會想用複雜的快速排序,還是直接比一比就好?我們來想想什麼時候該用哪一招?
解釋遞迴 (Recursion)「這叫遞迴,就是函式呼叫自己。」「你看,我們只是不斷重複這個簡單的遊戲。把一個大問題,變成好幾個小小的、容易解決的問題,這是不是很聰明的策略?」