数字排序
题目
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入
输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
输入样例
12
5 2 3 3 1 3 4 2 5 2 3 5
输出样例
3 4
2 3
5 3
1 1
4 1
提示
1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
参考代码
#include<stdio.h>
int main ()
{
int n;
scanf("%d",&n);
int a[n];
int b[n][2]={0};
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i][1]=1;
}
for(int i=0;i<n;i++)
{
if(a[i]!=-1)
{
b[i][0]=a[i];
for(int j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
b[i][1]++;
a[j]=-1;
}
}
}
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(b[i][1]<b[j][1])
{
int x,y;
x=b[i][0];y=b[i][1];
b[i][0]=b[j][0];b[i][1]=b[j][1];
b[j][0]=x;b[j][1]=y;
}
else if(b[i][1]==b[j][1]&&b[i][0]>b[j][0])
{
int x,y;
x=b[i][0];y=b[i][1];
b[i][0]=b[j][0];b[i][1]=b[j][1];
b[j][0]=x;b[j][1]=y;
}
}
}
for(int i=0;i<n;i++)
{
if(b[i][0])
{
printf("%d %d\n",b[i][0],b[i][1]);
}
}
return 0;
}
我的思路
将第一个数放入数组中,个数为1,遍历后面所有的数,有相同的,个数加1,并且将它令为-1;再往后移如果这个数不是-1,就继续相同的操作。将得到的数组进行两次排序:按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。(参考以上步骤)