题目描述
给定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
解题思路:
typedef struct Node{
int value;
int emTimes;
}node;
int cmp(const void* a, const void* b){
node c=*(node *)a;
node d=*(node *)b;
//return (*(int*)c.value - *(int*)d.value );
return (c.value-d.value); //从小到大排列
}
int cmp2(const void* a, const void* b){
node c=*(node *)a;
node d=*(node *)b;
//return (*(int*)c.value - *(int*)d.value );
if(c.emTimes==d.emTimes){
return (c.value-d.value);
}else{
return (d.emTimes-c.emTimes); //从大到小排列
}
}
int EmergeTimes(){
int n;
scanf("%d",&n);
node a[n];//说明:C99允许用变量值做数组长度,C89不行
int i,j;
for(i=0;i<n;i++){
scanf("%d",&a[i].value);
a[i].emTimes=1;
}
//第一次按值从小到大排序,便于计算出现次数
qsort(a,n,sizeof(node),cmp);
int prev=a[0].value,count=1;
for(i=1;i<n;i++){
if(a[i].value==a[i-1].value){
count++;
}else{
for(j=count;j>0;j--){
a[i-j].emTimes=count;
}
count=1;
}
//单独处理最后一组
//此处需要下标+1,因为之前是在后一组数据的第一个元素处修改值,现在是在本组元素的最后一个元素处修改值
if(i==n-1){
for(j=count;j>0;j--){
a[i-j+1].emTimes=count;
}
}
}
//第二次按出现次数从大到小排序
qsort(a,n,sizeof(node),cmp2);
i=0;
while(i<n){
printf("\n%d %d\n",a[i].value,a[i].emTimes);
i=i+a[i].emTimes;
}
return 0;
}
int main() {
EmergeTimes();
}