計數排序是一種穩定的線性時間排序演算法。該演算法於 1954 年由哈羅德H西華德提出。計數排序使用一個額外的陣列 C ，其中第 i 個元素是待排序陣列 A 中值等於 i 的元素的個數。然後根據陣列 C 來將 A 中的元素排到正確的位置。 計數排序的特徵 當輸入的元素是 n 個 0 到 k 之間的整數時，它的執行時間是 Theta nk 。計數排序不是比較排序，因此不被 Omega nlog n 的下界限制。 由於用來計數的陣列 C 的長度取決於待排序陣列中資料的範圍（等於待排序陣列的最大值與最小值的差加上 1），這使得計數排序對於資料範圍很大的陣列，需要大量時間和記憶體。例如：計數排序是用來排序 0 到 100 之間的數字的最好的演算法，但是它不適合按字母順序排序人名。但是，計數排序可以用在基數排序演算法中，能夠更有效的排序資料範圍很大的陣列。 通俗地理解，例如有 10 個年齡不同的人，統計出有 8 個人的年齡比 A 小，那 A 的年齡就排在第 9 位，用這個方法可以得到其他每個人的位置，也就排好了序。當然，年齡有重複時需要特殊處理（保證穩定性），這就是為什麼最後要反向填充目標陣列，以及將每個數字的統計減去 1。演算法的步驟如下： 找出待排序的陣列中最大和最小的元素 統計陣列中每個值為 i 的元素出現的次數，存入陣列 C 的第 iminValue 項 對所有的計數累加（從 C 中的第一個元素開始，每一項和前一項相加） 反向填充目標陣列：將每個元素 i 放在新陣列的第 C i 項，每放一個元素就將 C i 減去 1 Java 語言的實現 public class CountingSort public static void main String args int A CountingSortcountingSort new int 16 4 10 14 7 9 3 2 8 1 Utilsprint A public static int countingSort int A int B new int Alength 假設 A 中的資料 a 有，0a a k 並且 k100 int k 100 countingSort A B k return B private static void countingSort int A int B int k int C new int k 計數 for int j 0 j Alength j int a A j C a 1 Utilsprint C 求計數和 for int i 1 i k i C i C i C i 1 Utilsprint C 整理 for int j Alength 1 j 0 j int a A j B C a 1 a C a 1 針對 c 陣列的大小，最佳化過的計數排序 public class CountSort public static void main String args 排序的陣列 int a 100 93 97 92 96 99 92 89 93 97 90 94 92 95 int b countSort a for int i bSystemoutprint i Systemoutprintln public static int countSort int aint b new int alength int max a 0 min a 0 for int i aif i maxmax i if i minmin i 這裡 k 的大小是要排序的陣列中，元素大小的極值差 1 int k max min 1 int c new int k for int i 0 i alength ic a imin 1 最佳化過的地方，減小了陣列 c 的大小 for int i 1 i clength ic i c i c i1 for int i alength1 i 0 ib c a imin a i 按存取的方式取出 c 的元素 return b 另一種參考， 缺點：不適合資料落差大、浮點數，資料落差大會生成大 a 陣列，數少用其他演算更好。 優點：線性快，固定重複巨量資料適用，沒有更快，理論，只統計，不做多餘運算或搬移。 import javautilArrays import javautilRandom public class Csoft public static void main String args int arr 535000000 0 372 299830000 int arr 100 93 97 92 96 99 92 89 93 97 90 94 0 1195 int arr Random_Numbers 500000000 int arr Random_Numbers 20 Systemoutprintln ArraystoString arr new Csoft arr Systemoutprintln ArraystoString arr private int min Csoft Csoft int arr b arr public static int b int arr int max 0 min 0 for int i 0 i arrlength i max arr i arr max i max min arr i arr min i min int k arr min k 基數 max arr max 1 int a new int max k for int i 0 i arrlength i int o arr i k a o int t 0 for int j 0 j alength j if a j 0 for int i 0 i a j i arr t j k t return arr public static int Random_Numbers int num 亂數負數 Random r new Random int c new int num for int i 0 i num i c i rnextInt 1000 500 return c C 語言的實現 include stdioh include stdlibh include void print_arr const int arr const int n printf d arr 0 for int i 1 i n i printf d arr i printf n void counting_sort const int ini_arr int sorted_arr const int n const int max_val int count_arr int calloc max_val sizeof int for int i 0 i n i count_arr ini_arr i for int i 1 i max_val i count_arr i count_arr i 1 for int i n i 0 i sorted_arr count_arr ini_arr i 1 ini_arr i 1 free count_arr int main int argc char argv int n 10 int max_val 100 int arr int calloc n sizeof int int sorted_arr int calloc n sizeof int srand time 0 for int i 0 i n i arr i rand max_val printf ini_array print_arr arr n counting_sort arr sorted_arr n max_val printf sorted_array print_arr sorted_arr n free arr free sorted_arr return 0 javascript 實現 ArrayprototypecountSort function const C for let i 0 i thislength i const j this i C j 1 C j C j 1 const D for let j 0 j Clength j if C j while C j 0 Dpush j C j return D const arr 11 9 6 8 1 3 5 1 1 0 100 consolelog arrcountSort Golang 的實現 func countingSort arr int minvalue maxValue int int bucketLen maxValue minvalue 1 bucket make int bucketLen for _ v range arr bucket vminvalue result make int len arr index 0 for k v range bucket kk k minvalue for j v j 0 j result index kk index return result Python3 的實現 coding utf8 def count_sort a list list a_min int min a k int max a a_min 1 c list 0 for _ in range k for i in a c i a_min 1 for i v in enumerate c if i 0 continue c i v c i1 result list None for _ in range len a for i in a result c i a_min 1 i c i a_min 1 return result if __name__ __main__ print count_sort 652 721 177 977 24 17 126 515 442 917 註解 參考資料 Thomas H Cormen Charles E Leiserson Ronald L Rivest and Clifford Stein 演算法導論，第二版 MIT Press and McGrawHill 2001 ISBN 0262032937 第 82 章：計數演算法，pp 168170 高德納。計算機程式設計藝術，第三卷：排序和查詢，第二版 AddisonWesley 1998 ISBN 0201896850 Section 52 Sorting by counting pp 7580 Seward Harold H Information sorting in the application of electronic digital computers to business operations Masters thesis MIT 1954 httpwwwnistgovdadsHTMLcountingsorthtml NISTs Dictionary of Algorithms and Data Structures counting sort Category 排序演算法