CCF 201503-2 数字排序

问题描述
试题编号: 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 
#include 
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;iscanf("%d",&a[i]);
    }
    //统计次数
    for(i=0;i0]=a[i];
        num[i][1]=1;
        for(j=i+1;jif(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;iif(num[i][0]!=-1){
        for(j=0;j<2;j++){

            printf("%d ",num[i][j]); 
        }
        printf("\n");
        }
    } 
    return 0;
} 

在网上看到一个很巧妙的实现方法如下:

#include 
#include 
#include 
int a[1005];
int main(){
    int n;
    scanf("%d",&n);
    int i,j;
    int u;
    memset(a,0,sizeof(a));
    for(i=0;iscanf("%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的写法,这里进行了两次排序

你可能感兴趣的:(ccf---C语言/java)