任何比較排序(歸併排序,插入排序等等)的時間複雜度在最壞的狀況下都須要作Ω(n * lgn)次比較,而這裏的的計數排序因爲它不是基於比較排序的思路,因此它的複雜度不收這個限制,它的時間複雜度爲Θ(n),爲線性時間。同時,計數排序一個重要的性質就是它是穩定的,也就是說,對於兩個相同的數來講,在輸入數組中先出現的,在輸出數組中也位於前面。ios
詳細知識參考《算法導論》P109算法
----------------------------------------------------------代碼以下------------------------------------------------------------數組
1 // 計數排序.cpp: 定義控制檯應用程序的入口點。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <vector> 7 8 using namespace std; 9 10 int COUNTING_SORT(vector<int> &A,vector<int> &B,int k)//A爲輸入數組,B爲輸出數組,A中放入元素都是在[0,k]之間的,當k = O(n)時,算法的時間複雜度是線性時間 11 { 12 int *C = new int[k + 1]{0};//C[0..k]提供臨時存儲空間 13 for (int i = 0; i < A.size(); i++) 14 { 15 if (!(A[i] >= 0 && A[i] <= k)) 16 { 17 cout << "輸入數組中的元素有不在[ 0," << k << " ]之間的!"; 18 delete C; 19 return 0; 20 } 21 } 22 23 for (int i = 0; i < A.size(); i++) 24 C[A[i]] ++; 25 //如今C[i]的值表示A中值等於i的元素的個數 26 27 for (int i = 1; i <= k; i++) 28 C[i] += C[i - 1]; 29 //如今C[i]的值表示A中值小於或者等於i的元素的個數 30 31 for (int i = A.size() - 1; i >= 0; i--) 32 { 33 B[C[A[i]]-1] = A[i]; 34 C[A[i]]--; 35 } 36 delete C; 37 return 0; 38 } 39 40 41 int main() 42 { 43 vector<int> A = {2,5,3,0,2,3,0,3}; 44 for (auto c : A) 45 cout << c << ends; 46 cout << endl; 47 48 vector<int> B(8,0); 49 COUNTING_SORT(A, B, 5); 50 for (auto c : B) 51 cout << c << ends; 52 cout << endl; 53 return 0; 54 }
運行結果以下:spa