水题。第一次用了插入排序结果超时,第二次换了希尔排序结果WA了(错在学号用的是int,输出用的是06d)换成char[]就过了。
#include <stdio.h>
#include <string.h>
#define N 100000
struct student
{
char num[10]; //学号 原先用的int
char name[10];
int score;
}Excel[N];
void Sort1(int);
void Sort2(int);
void Sort3(int);
int main(void)
{
int n,m,mark=0;
while(scanf("%d%d",&n,&m)&&n)
{
for(int i=0;i<n;++i)
scanf("%s%s%d",Excel[i].num,
Excel[i].name,&Excel[i].score);
switch(m)
{
case 1:
Sort1(n);
break;
case 2:
Sort2(n);
break;
case 3:
Sort3(n);
break;
}
printf("Case %d:\n",++mark);
for(int i=0;i<n;++i)
printf("%s %s %d\n",Excel[i].num,
Excel[i].name,Excel[i].score);
}
return 0;
}
void swap(struct student *a,struct student *b)
{
struct student t=*a;
*a=*b;
*b=t;
}
void Sort1(int n)
{
for(int i=n/2;i>=1;i/=2)
for(int j=i;j<n;++j)
for(int k=j;k>=i&&strcmp(Excel[k].num,Excel[k-i].num)<0;k-=i)
swap(&Excel[k],&Excel[k-i]);
}
void Sort2(int n)
{
for(int i=n/2;i>=1;i/=2)
for(int j=i;j<n;++j)
for(int k=j;k>=i&&strcmp(Excel[k].name,Excel[k-i].name)<=0;k-=i)
if(strcmp(Excel[k].name,Excel[k-i].name)==0)
{
if(strcmp(Excel[k].num,Excel[k-i].num)<0)
swap(&Excel[k],&Excel[k-i]);
}
else
swap(&Excel[k],&Excel[k-i]);
}
void Sort3(int n)
{
for(int i=n/2;i>=1;i/=2)
for(int j=i;j<n;++j)
for(int k=j;k>=i&&Excel[k].score<=Excel[k-i].score;k-=i)
if(Excel[k].score==Excel[k-i].score)
{
if(strcmp(Excel[k].num,Excel[k-i].num)<0)
swap(&Excel[k],&Excel[k-i]);
}
else
swap(&Excel[k],&Excel[k-i]);
}