#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 学生结构体
typedef struct {
char name[100];
int score;
int index; // 用于稳定排序的索引
} Student;
// 降序排序函数
int compare_desc(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
// 成绩高的排在前面
if (s1->score != s2->score) {
return s2->score - s1->score;
}
// 成绩相同时,按输入顺序排列
return s1->index - s2->index;
}
// 升序排序函数
int compare_asc(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
// 成绩低的排在前面
if (s1->score != s2->score) {
return s1->score - s2->score;
}
// 成绩相同时,按输入顺序排列
return s1->index - s2->index;
}
// 主要功能函数
void fun(int n, int sort_type, Student students[]) {
// 根据排序类型选择不同的比较函数
if (sort_type == 0) {
// 降序排序
qsort(students, n, sizeof(Student), compare_desc);
} else {
// 升序排序
qsort(students, n, sizeof(Student), compare_asc);
}
// 输出排序结果
for (int i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
}
int main() {
int n; // 学生人数
int sort_type; // 排序类型:0-降序,1-升序
// 循环处理多组数据
while (scanf("%d", &n) != EOF) {
scanf("%d", &sort_type);
Student* students = (Student*)malloc(n * sizeof(Student));
// 输入学生信息
for (int i = 0; i < n; i++) {
scanf("%s %d", students[i].name, &students[i].score);
students[i].index = i; // 记录输入顺序
}
// 调用主要功能函数
fun(n, sort_type, students);
free(students); // 释放内存
}
return 0;
}