记录比当前值小的数的数目,然后直接放到要排序的位置
其中需要一个数组当作输入数组,一个数组当作临时的储存空间,另一个则作为输出数组
值得一提的是计数排序还需要限定一个范围k,因为只能排序0-k内的数,若超过就会无法排序。
时间复杂度O(n+k),n指代待排序的数目个数,k指代数目的大小范围
#include <iostream>
using namespace std;
const int MAXN=1e5;
int k=1000;
/*
*a 输入数组
*c 输出数组
*rank 名次数组
*/
int a[MAXN],c[MAXN],rank[MAXN];
void countSort(int a[],int c[],int n)
{
for(int i=0;i<n;i++)
rank[a[i]]++;
//统计排名
for(int i=1;i<k;i++)
rank[i]+=rank[i-1];
for(int i=0;i<n;i++)
c[--rank[a[i]]]=a[i];
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
countSort(a,c,n);
for(int i=0;i<n;i++)
cout<<c[i]<<endl;
return 0;
}
c++对数组默认赋值为0,所以就没有初始化数组