← 回首頁

計數排序法 (Counting Sort) 視覺化工具

視覺化展示

計數陣列 (Count Array)
掃描與計數中
寫回陣列中
排序完成
400ms

演算法偽代碼

function countingSort(arr):
1 max_val = max(arr)
2 countArr = new Array(max_val + 1).fill(0)
3 for i = 0 to arr.length - 1:
4 countArr[arr[i]]++ // 計算各元素出現次數
5 target_idx = 0
6 for i = 0 to max_val:
7 while countArr[i] > 0:
8 arr[target_idx] = i // 依序寫回原陣列
9 countArr[i]--
10 target_idx++

操作原理

計數排序法 (Counting Sort) 是一種非比較型的排序演算法。它不依賴元素之間的比較,而是利用陣列的索引(Index)來記錄元素出現的次數。

它的核心思想是:找出陣列中的最大值 k,建立一個長度為 k+1 的新陣列(計數陣列)。接著走訪原本的陣列,每遇到一個數字,就在計數陣列對應的索引位置將次數加一。最後,按照計數陣列的順序和次數,依序將數字填回原本的陣列中,排序就完成了。

操作過程

  1. 找出最大值: 掃描整個陣列,找出其中的最大值 k
  2. 建立計數陣列: 建立一個長度為 k+1 的計數陣列,並將所有元素初始化為 0。
  3. 統計次數: 走訪原陣列,遇到數字 x,就將計數陣列索引為 x 的位置加 1。
  4. 寫回原陣列: 從頭掃描計數陣列,索引 i 的位置值為 c 時,代表數字 i 出現了 c 次,依序將 ci 寫回原陣列即可。

複雜度分析

  • 時間複雜度(所有情況): O(n + k)
    其中 n 是陣列長度,k 是陣列中的最大值。因為只需要走訪原陣列和計數陣列各一次,速度非常快(線性時間)。
  • 空間複雜度(Space Complexity): O(k)
    需要一個額外的計數陣列,長度取決於原陣列中的最大數字 k。如果 k 極大(例如數字包含一百萬),則會非常消耗記憶體,因此計數排序只適合用在資料範圍較小且集中的情況
🌙