代码如下:
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为待排元素最大值
浙公网安备 33010602011771号