先上代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num,t,i;
int count = 0;
scanf("%d",&num);
int a[num];
int max=0;
for(i=0;i<num;i++){
scanf("%d",&a[i]);
if(a[i]>max)
{
max=a[i];
}
}
int aim[max];
for (i=0;i<=max;i++)
{
aim[i]=0;
}
for(i=0;i<num;i++){
t=a[i];
if(aim[t]==0){
aim[t] = t;
count++;
}
}
printf("%d\n",count);
for(i=0;i<=max;i++){
if(aim[i]!=0){
printf("%d ",aim[i]);
}
}
return 0;
}
计数排的思想比较简单其基本思想如下
假设每个数字是一个桶,我们每读取到一个数就往桶里放一个东西,当读取完成有数据的桶里就有东西,没有数据的桶里没有东西,只需要从头到尾输出桶里有东西的序号即可对排序,做到去重且排序的效果,但是桶排序的缺点也很明显,需要的空间很大,同时我们需要知道数据里的最大值,因为有最大值我们才知道需要多少个桶。这就造成了浪费空间,因为很多数据的空间开辟出来并没有使用,就比如1和1000进行桶排,那么我们就需要开辟一个长度为1001的数组(1001保险)。代码中我没有进行完全的打印,如果不需要去重操作,只需要让对应的桶计数依次增加,最后输出时多做一个循环即可。