1)记录每个数出现的个数
2)从记录数出现次数的数组的小端的开始遍历
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
void print(int a[],int length)
{
for(int i=0; i<length; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void countsort(int a[],int length)
{
int minn=a[0],maxx=a[0];
for(int i=1;i<length;i++)
{
if(a[i]<minn)
minn=a[i];
if(a[i]>maxx)
maxx=a[i];
}
int * a_cnt=NULL;
a_cnt=(int*)malloc(sizeof(int)*(maxx-minn+1));
memset(a_cnt,0,sizeof(int)*(maxx-minn+1));
for(int i=0;i<length;i++)
{
a_cnt[a[i]-minn]++;
}
int j=0;
for(int i=0;i<maxx-minn+1;i++)
{
while(a_cnt[i])
{
a[j]=i+minn;
j++;
a_cnt[i]--;
}
}
free(a_cnt);
a_cnt=NULL;
}
int main()
{
int a[100];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",a+i);
}
countsort(a,n);
print(a,n);
}