时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
有 N 个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名
字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出 N
个学生排序后的信息。
输入:
测试数据有多组,每组输入第一行有一个整数 N(N<=1000),接下来的 N
行包括 N 个学生的数据。每个学生的数据包括姓名(长度不超过 100 的字符串)、
年龄(整形数)、成绩(小于等于 100 的正数)。
输出:
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。然后
输出学生信息,按照如下格式:姓名 年龄 成绩
样例输入:
3
abc 20 99
bcd 19 97
bed 20 97
样例输出:
bcd 19 97
bed 20 97
abc 20 99
解答:采用C++sort()函数解决,复杂度为O(nlog2n)。
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
/*
定义结构体
*/
struct E {
char name[100];
int age;
int score;
} buf[1000];
//自定义比较规则
bool cmp(E a,E b) {
//学生分数相同则比较姓名字符的字母序
if(a.score == b.score) {
int temp = strcmp(a.name,b.name);
//如果字母序不相同则姓名字符串字典序小的在前面
if(temp =! 0) {
return temp<0;
} else
//如果姓名字典序相同则年龄小的在前面
return a.age<b.age;
-
} else
return a.score < b.score;
}
int main(){
int n;
//结构体数组赋值
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%s%d%d",&buf[i].name,&buf[i].age,&buf[i].score);
}
//时间复杂度O(n*log2n),cmp()函数为自定义排序规则
sort(buf,buf+n,cmp);
printf("\n");
//输出排序结果
for(int i=0;i<n;i++){
printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
}
}
return 0;
}
C++Sort函数有三个参数:排序的数组的起始地址;结束的地址;排序的方法(自定义排序函数);可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
C语言版:采用qsort()排序函数,复杂度为O(nlog2n),C语言采用的是快排算法;C++sort()采用的是改进后的快排,实际比qsort()快些。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/*
定义结构体
*/
typedef struct E {
char name[100];
int age;
int score;
}buf;
/*
a为void *类型,要用(E*)强转成E*类型
然后用*取值比较大小
*/
int cmp(const void *a,const void *b) {
//定义结构体指针时,用->访问成员;定义结构体成员的时候就用.访问成员,差点弄错QAQ
//转成E型指针,再用A指向buff实参
struct E *A = (E*)a;
struct E *B = (E*)b;
if(A->score == B->score) {
int temp = strcmp(A->name,B->name);
if(temp != 0) {
return temp<0;
} else
//按age从小到大排序
return A->age - B->age;
} else
//按score从小到大排序
return A->score - B->score;
}
int main() {
int n;
struct E buf[1000];
//结构体数组赋值
while(scanf("%d",&n)!=EOF) {
for(int i=0; i<n; i++) {
scanf("%s%d%d",&buf[i].name,&buf[i].age,&buf[i].score);
}
//时间复杂度O(n*log2n),cmp()函数为自定义排序规则
qsort(buf,n,sizeof(buf[0]),cmp);
printf("\n");
//输出排序结果
for(int i=0; i<n; i++) {
printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
}
}
return 0;
}
C的qsort函数具体用法:qsort()函数用法