继续研究排序问题。对于,教程在引导我们分析问题规模(N<=1000)与时间限制(<1s)关系后,虽然可以使用冒泡排序,但为了显示sort函数的优越性,依然使用此函数。此时由于比较规则比较复杂,与上文一样,我们需要编写一个比较函数cmp来说明规则。这样,只需在sort中,将比较规则函数cmp作为其最后一个参数传递进去就行了。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct information{
char name[101];
int score;
int age;
}buf[1000];
bool cmp(information a,information b){
if(a.score!=b.score)
return a.score<b.score;
int tmp=strcmp(a.name,b.name);
if(tmp!=0)
return tmp<0;
else
return a.age<b.age;
}
int main(){
int n,i;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);
sort(buf,buf+n,cmp);
for(i=0;i<n;i++)
printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
}
return 0;
}
然而,教程并不推荐我们使用这种方式。他提到,可以利用C++的运算符重载直接在结构体里面定义‘<’的意义。由于sort只利用‘<’来排序,因此这样重载运算符后也是可以的。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct information{
char name[101];
int score;
int age;
bool operator < (const information &b)const{
if( score!=b.score)
return score<b.score;
int tmp=strcmp( name,b.name);
if(tmp!=0)
return tmp<0;
else
return age<b.age;
}
}buf[1000];
int main(){
int n,i;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);
sort(buf,buf+n);
for(i=0;i<n;i++)
printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
}
return 0;
}
课后练习:
1185_特殊排序
1023_Excel排序
1054_字符串内排序
/*Program 1061
题目1061:成绩排序