计数排序就是利用空间换时间,时间复杂度O(n+k) n是元素个数,k是最大数的个数;
统计每个数比他小的有多少,比如比a[i]小的有x个,那么a[i]应该排在x+1的位置
代码:
/*
* @Author: LyuC
* @Date: 2017-10-11 21:24:27
* @Last Modified by: LyuC
* @Last Modified time: 2017-10-11 21:39:36
*/
#include <bits/stdc++.h> #define MAXN 10005 using namespace std; int a[MAXN];//原始数组
int b[MAXN];//结果数组
int c[MAXN];//统计数组中有多少小于 i 的数
int k;//最大值是多少
int n; int main(){
freopen("in.txt","r",stdin);
scanf("%d",&n);
memset(c,,sizeof c);
k=-;
for(int i=;i<n;i++){
scanf("%d",&a[i]);
k=max(k,a[i]);
c[a[i]]++;
}
for(int i=;i<=k;i++){
c[i]+=c[i-];
}
for(int i=;i<n;i++){
b[c[a[i]]-]=a[i];
c[a[i]]--;
}
for(int i=;i<n;i++){
cout<<b[i]<<" ";
}cout<<endl;
return ;
}