计数排序(O(n+k)的排序算法,空间换时间)
计数排序就是利用空间换时间,时间复杂度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,0,sizeof c); k=-1; for(int i=0;i<n;i++){ scanf("%d",&a[i]); k=max(k,a[i]); c[a[i]]++; } for(int i=1;i<=k;i++){ c[i]+=c[i-1]; } for(int i=0;i<n;i++){ b[c[a[i]]-1]=a[i]; c[a[i]]--; } for(int i=0;i<n;i++){ cout<<b[i]<<" "; }cout<<endl; return 0; }
我每天都在努力,只是想证明我是认真的活着.