@TOC
排序应用
1. 成绩排序
输入N个学生的数据,将学生的成绩由低到高排序,如果成绩相同,那么按照姓名的字母序排序,如果字母序也相同,那么按照年龄排序。
样例输入: 样例输出:
3
abc 20 99 bcd 19 97
bcd 19 97 bed 20 97
bed 20 97 abc 20 99
(1)以下是实现的C++程序1:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using namespace std;
struct Student {
char name[101];
int age;
int score;
} buf[1000];
bool cmp(Student A, Student 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;
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);
}
// 使用重载形式表明将要使用自己定义的排序规则
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;
}
(2)以下是实现的C++程序1:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using namespace std;
struct Student {
char name[101];
int age;
int score;
bool operator < (const Student &B) const {
// 利用C++算符重载直接定义小于运算符
// 如果分数不相同,则分数低的在前
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;
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);
}
sort(buf, buf + n);
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;
}