7.4 計數排序
阿新 • • 發佈:2020-09-12
程式碼如下:
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為待排元素最大值