排序演算法

國中電腦科學確定性的比較排序軌跡;主陣列寫入次數另行計算

準備排序

11091325374451061278829110611

橘色標記表示此操作涉及的位置。索引從零開始。使用「上一步」和「步進」查看每項操作。

關於此實驗

觀察泡沫排序、插入排序和合併排序如何將相同輸入轉換為升冪。你可以在比較時暫停、逐步查看每次寫入,也可以沿著完整軌跡向後移動。分別統計值比較次數和主陣列寫入次數,有助於區分演算法的工作量與動畫播放時間。

學習目標

  • 追蹤三種比較排序演算法中的比較和寫入
  • 比較演算法在亂序、已排序和反向排序輸入上的效能
  • 區分最壞情況下的二次成長與 n log n 成長

使用方法

  1. 1固定亂序輸入和陣列長度。執行完泡沫排序,並記錄比較次數和寫入次數。
  2. 2使用相同輸入重新執行插入排序,接著執行合併排序。比較最終計數。
  3. 3嘗試已排序的輸入,觀察泡沫排序的提早結束,以及插入排序較少的比較次數。
  4. 4使用「Previous」和軌跡滑桿查看合併過程。暫存緩衝區可以保存那些在原本主陣列位置上已不可見的值。

模型

泡沫排序最壞情況下的值比較次數
插入排序和合併排序最壞情況下的時間成長
一次交換按對主陣列進行兩次寫入計算

假設

  • 輸入包含從 1 到 n 的不重複整數。打亂資料時使用固定種子,因此每種演算法接收的資料都相同。
  • 比較是測試資料值,而不是測試索引或迴圈邊界。寫入是指對主陣列進行指派,包括未改變的插入鍵。
  • 合併排序複製到暫存緩衝區的操作不計入寫入次數。額外記憶體用量也不計入顯示的操作總數。
  • 播放速度是為教學目的設定的,並非實際執行時間的效能基準。

在課堂上試試這個實驗

  1. Q1在此實作中,對於已排序的輸入,為什麼泡沫排序只需要進行 n − 1 次比較?
  2. Q2陣列長度相同時,對於逆序輸入,哪種演算法的比較次數較少?
  3. Q3為什麼動畫影格數不是衡量演算法速度的可靠指標?

常見問題

為什麼在插入排序或合併排序過程中,值會短暫重複顯示?

覆寫主陣列時,某個值可能暫存在暫存鍵或合併緩衝區中。視覺化會在每次寫入時顯示主陣列的內容;操作完成後,重複現象就會消失。

合併排序總是寫入次數較少嗎?

不是。合併排序的比較次數成長較有效率,但會反覆將合併結果寫回。操作次數取決於輸入資料,以及具體計算哪些指派操作。