#200: 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
时间限制:2 sec. 内存限制:128 MB.
试题描述
给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
输入格式
第一行为n (0 < n < 20),表示班里的学生数目;接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。
输出格式
把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。
样例输入
4 Kitty 80 Hanmeimei 90 Joey 92 Tim 28
样例输出
Joey 92 Hanmeimei 90 Kitty 80 Tim 28
#include<stdio.h>
#include<memory.h>
#include<string.h>
typedef struct
{
char a[50];
int b;
} r;
r ren[25];
r x[25];
void marge_sort(r *A,int x,int y,r *T) //x___start,y___end+1//
{
if(y-x>1)
{
int m=(x+y)/2;
int p=x,q=m,i=x;
marge_sort(A,x,m,T);
marge_sort(A,m,y,T);
while(p<m||q<y)
{
if(q>=y||(p<m&&A[p].b>A[q].b))T[i++]=A[p++]; ///同分判断
else if(p<m&&q<y&&(A[p].b==A[q].b))
{
if(strcmp(A[p].a,A[q].a)>0)T[i++]=A[q++];
else T[i++]=A[p++];
}
else T[i++]=A[q++];
}
for(i=x; i<y; i++)A[i]=T[i];
}
}
void so(r*pst,int len)
{
r tst;
for(int m=0; m<len; m++)
{
for(int n = 0; n<len-1-m; n++) ///同分判断
if(pst[n].b < pst[n+1].b)
{
tst = pst[n];
pst[n] = pst[n+1];
pst[n+1] = tst;
}
else if(pst[n].b == pst[n+1].b)
{
if(strcmp(pst[n].a,pst[n+1].a)>0)
{
tst = pst[n];
pst[n] = pst[n+1];
pst[n+1] = tst;
}
}
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
{
scanf("%s %d",ren[i].a,&ren[i].b);
}
so(ren,n);
//marge_sort(ren,0,n,x);
for(int i=0; i<n; i++)
{
printf("%s %d\n",ren[i].a,ren[i].b);
}
}
return 0;
}