EXCEL排序
Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11903    Accepted Submission(s): 4736
行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node{
    char num[8];
    char name[10];
    int cj;
}Node;
Node s[110000];
int cmpnum(const void *a,const void *b)
{
    Node *c = (Node *)a;
    Node *d = (Node *)b;
    return strcmp(c->num , d->num);
}
int cmpname(const void *a,const void *b)
{
    Node *c = (Node *)a;
    Node *d = (Node *)b;
    if(strcmp(c->name,d->name)!=0)
    return strcmp(c->name , d->name) ;
    else
    return strcmp(c->num , d->num);
}
int cmpcj(const void *a,const void *b)
{
    Node *c = (Node *)a;
    Node *d = (Node *)b;
    if(c->cj!=d->cj)
    return c->cj - d->cj;
    else
    return strcmp(c->num , d->num);
}
int main()
{
    int m,n,k=1;
    while(scanf("%d %d",&n,&m),n)
    {
        int i,j;
        for(i=0;i<n;i++)
        scanf("%s%s%d",s[i].num,s[i].name,&s[i].cj);
        if(m==1)
        qsort(s,n,sizeof(s[0]),cmpnum);
        if(m==2)
        qsort(s,n,sizeof(s[0]),cmpname);
        if(m==3)
        qsort(s,n,sizeof(s[0]),cmpcj);
        printf("Case %d:\n",k++);
        for(i=0;i<n;i++)
        printf("%s %s %d\n",s[i].num,s[i].name,s[i].cj);
    }
    return 0;
}
qsort--结构体