代码如下:

 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为待排元素最大值

posted on 2020-09-12 11:47  高数考了59  阅读(177)  评论(0)    收藏  举报