用了三个快速排序的子函数进行排序,排序结束后,再从头循环,判断成绩或者姓名是否相同。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <string>
using namespace std;
const int maxn =100000 + 100;
typedef struct one_person_info
{
int id;
string name;
int grade;
}N;
N stu[maxn];
void quick_sort1(int left,int right)
{
int i,j;
i=left;j=right;
if(left<right)
{
stu[0]=stu[i];
while(i!=j)
{
while(stu[0].id<stu[j].id && i<j) j--;
if(i<j)
{
stu[i]=stu[j];
i++;
}
while(stu[0].id>stu[i].id && i<j) i++;
if(i<j)
{
stu[j]=stu[i];
j--;
}
}
stu[i]=stu[0];
quick_sort1(left,i-1);
quick_sort1(i+1,right);
}
}
void quick_sort2(int left,int right)
{
int i,j;
i=left;j=right;
if(left<right)
{
stu[0]=stu[i];
while(i!=j)
{
while(stu[0].name<stu[j].name && i<j) j--;
if(i<j)
{
stu[i]=stu[j];
i++;
}
while(stu[0].name>stu[i].name && i<j) i++;
if(i<j)
{
stu[j]=stu[i];
j--;
}
}
stu[i]=stu[0];
quick_sort2(left,i-1);
quick_sort2(i+1,right);
}
}
void quick_sort3(int left,int right)
{
int i,j;
i=left;j=right;
if(left<right)
{
stu[0]=stu[i];
while(i!=j)
{
while(stu[0].grade<stu[j].grade && i<j) j--;
if(i<j)
{
stu[i]=stu[j];
i++;
}
while(stu[0].grade>stu[i].grade && i<j) i++;
if(i<j)
{
stu[j]=stu[i];
j--;
}
}
stu[i]=stu[0];
quick_sort3(left,i-1);
quick_sort3(i+1,right);
}
}
int num;
int main ()
{
char s[10];
int n,C,i,j,len,left,right;
while(scanf("%d%d",&n,&C)==2)
{
if(n==0 && C==0) return 0;
num++;
for(i=1;i<=n;i++)
{
scanf("%d",&stu[i].id);
cin>>stu[i].name;
scanf("%d",&stu[i].grade);
}
printf("Case %d:\n",num);
if(C==1)
{
quick_sort1(1,n);
for(i=1;i<=n;i++)
{
itoa(stu[i].id,s,10);
len=strlen(s);
for(j=1;j<=6-len;j++)
printf("0");
printf("%d ",stu[i].id);
cout<<stu[i].name;
printf(" %d\n",stu[i].grade);
}
}
else if(C==2)
{
quick_sort2(1,n);
i=1;
while(i<n)
{
if(stu[i].name==stu[i+1].name)
{
left=i;
while(stu[i].name==stu[i+1].name) i++;
right=i;
quick_sort1(left,right);
}
i++;
}
for(i=1;i<=n;i++)
{
itoa(stu[i].id,s,10);
len=strlen(s);
for(j=1;j<=6-len;j++)
printf("0");
printf("%d ",stu[i].id);
cout<<stu[i].name;
printf(" %d\n",stu[i].grade);
}
}
else if(C==3)
{
quick_sort3(1,n);
i=1;
while(i<n)
{
if(stu[i].grade==stu[i+1].grade)
{
left=i;
while(stu[i].grade==stu[i+1].grade) i++;
right=i;
quick_sort1(left,right);
}
i++;
}
for(i=1;i<=n;i++)
{
itoa(stu[i].id,s,10);
len=strlen(s);
for(j=1;j<=6-len;j++)
printf("0");
printf("%d ",stu[i].id);
cout<<stu[i].name;
printf(" %d\n",stu[i].grade);
}
}
}
return 0;
}