问题描述
试题编号: 201503-2
试题名称: 数字排序
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
给定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>
#include <stdlib.h>
int num[1000][2];
int a[1000];
//二维数组排序
int cmp(const void *i,const void *j){
int *a= (int *)i; //a指针指向num[i]的内容,即一维数组首地址
int *b = (int *)j;
//(*a)是数字,*(a+1)表示次数
if( *(a+1)== *(b+1) ){
return (*a)-(*b);
}else return *(b+1)-*(a+1);
}
int main(){
int n;
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
//统计次数
for(i=0;i<n;i++){
num[i][0]=a[i];
num[i][1]=1;
for(j=i+1;j<n;j++){
if(a[i]==a[j]){
num[i][1]++;
a[j]=-1;
}
}
}
qsort(num,n,sizeof(num[0]),cmp);
//这边第二个参数,是需要比较个数,虽然是二维数组 ,但排序是以一行为单位,所以是n;
//如果填写n*2,结果没错,但ccf只有60分。
for(i=0;i<n;i++){
if(num[i][0]!=-1){
for(j=0;j<2;j++){
printf("%d ",num[i][j]);
}
printf("\n");
}
}
return 0;
}
在网上看到一个很巧妙的实现方法如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[1005];
int main(){
int n;
scanf("%d",&n);
int i,j;
int u;
memset(a,0,sizeof(a));
for(i=0;i<n;i++){
scanf("%d",&u);
a[u]++;
}
for(i=1004;i>0;i--){//出现次数 ,从大到小
for(j=0;j<1005;j++){//相同次数,数字从小到大
if(a[j]==i){
printf("%d %d\n",j,i);
}
}
}
return 0;
}
注意:
1、qsort(num,n,sizeof(num[0]),cmp);
qsort的第二个参数,是需要比较个数,虽然是二维数组 ,但排序是以一行为单位,所以是n;如果填写n*2,结果没错,但ccf只有60分。
2、关于cmp的写法,这里进行了两次排序