思路:
由于N的范围为【1,1000】,开数组没问题,可以考虑用计数排序。计数排序的本质是以每一个数个体为标杆,因此可以解决重复数字的问题。
代码实现(附详解):
#include<stdio.h>
int main()
{
int a[1005]={0};
int N,M=0;
int i;
int x;
scanf("%d",&N);
for (i=0;i<N;i++)
{
scanf("%d",&x); //读入每一个数
if (a[x]==0) //以每一个读入的数作为下标
{
a[x]=1; //首次出现,a[x]变为1,不重复数字总数加一
M++;
}
else
a[x]=1; //再次出现,a[x]值不变,但不重复数字总数不再改变
}
printf("%d\n",M);
for (i=0;i<1005;i++)
{
if (a[i]==1)
printf("%d ",i);
else
continue;
}
return 0;
}
深入思考:
本题是计数排序的变向应用,而对于计数排序来说,是基于分类而非基于比较后互换的排序,是属于分治的思想。