1. 程式人生 > 實用技巧 >7.4 計數排序

7.4 計數排序

程式碼如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 /*
 5 這裡maxnum表示陣列中最大元素值
 6 用count陣列來計數,完事兒count陣列做處理,得到每個元素前面有多少個比它小的
 7 從右到左掃描原陣列,將數字放到對應位置,計數減1,這樣能保證穩定性
 8 */
 9 
10 static vector<int> countingSort(vector<int> &v, int maxnum){
11     vector<int> count(maxnum+1
, 0); 12 for(int i : v) 13 count[i]++; 14 int szc = count.size(); 15 for(int i=1;i<szc;i++) 16 count[i] += count[i-1]; 17 int szv = v.size(); 18 vector<int> temp(szv); 19 for(int i=szv-1;i>=0;i--){ 20 temp[count[v[i]]-1] = v[i]; 21 count[v[i]]--;
22 } 23 return temp; 24 } 25 26 int main(){ 27 int n; 28 int maxnum = INT_MIN; 29 while(cin>>n){ 30 vector<int> v(n); 31 for(int i=0;i<n;i++){ 32 cin>>v[i]; 33 maxnum = max(v[i], maxnum); 34 } 35 vector<int
> res = countingSort(v, maxnum); 36 for(int num : res) 37 cout<<num<<","; 38 } 39 return 0; 40 }

計數排序適用於元素區間比較密集的情況,是穩定的排序

時間複雜度O(n+k),n為待排元素個數,k為待排元素最大值