《编程思维与实践》1028.排序去重
题目

思路
法一(最方便):直接将所有数据进行排序,相同数据则会排在相邻位置,控制输出保证不输出相同数据即可.
法二(桶排序):桶排序就是将数组分到有限数量的桶里再对每个桶进行个别排序.在这题中注意到数据最大只有1000,只需要开大小为1001的数组,之后将出现的数字数组存为1,不出现存0,输出时顺序或逆序输出不为0的数组对应的数字即可.
注意的点:
一组数据的输入可以直接用EOF来判断输入是否结束,如果是多组数据则需要分割字符串.
代码
法一:
int cmp1(const void *a,const void *b)
{
int *m=(int*)a;
int *n=(int*)b;
return *m-*n; //升序
}
int cmp2(const void *a,const void *b)
{
int *m=(int*)a;
int *n=(int*)b;
return *n-*m; //降序
}
int main()
{
char judge;
judge=getchar();
int number[100];
int i=0;
while(scanf("%d",&number[i])!=EOF) //EOF判断一组数据输入结束
{
i++;
}
if(judge=='A')
{
qsort(number,i,sizeof(int),cmp1);
}
if(judge=='D')
{
qsort(number,i,sizeof(int),cmp2);
}
for(int j=0;j<i;j++)
{
printf("%d ",number[j]);
while(number[j]==number[j+1]) //相同只输出一个
{
j++;
}
}
return 0;
}
法二:
int main()
{
char judge;
judge=getchar();
int tab[1001]={0};
int number;
while(scanf("%d",&number)!=EOF) //EOF判断一组数据输入结束
{
if(tab[number]==0)
{
tab[number]=1;
}
}
if(judge=='A')
{
for(int j=0;j<1001;j++)
{
if(tab[j]==1)
{
printf("%d ",j);
}
}
}
if(judge=='D')
{
for(int j=1000;j>=0;j--)
{
if(tab[j]==1)
{
printf("%d ",j);
}
}
}
return 0;
}