用c语言表示输入所有同学的语文、数学成绩和他们的学号。 以语文为第一关键字,数学为第二关键字排序,按成绩降序排序。 若语文、数学成绩均相同则学号小的同学排前面。 题目保证每个同学的学号不相同。 输出排序后所有同学的学号
时间: 2024-02-28 21:52:09 浏览: 91
好的,这是用C语言实现的代码:
```c
#include <stdio.h>
typedef struct {
int id; // 学号
int chinese; // 语文成绩
int math; // 数学成绩
} Student;
void merge_sort(Student arr[], int l, int r);
void merge(Student arr[], int l, int mid, int r);
int cmp(Student a, Student b);
int main() {
int n;
scanf("%d", &n);
Student stu[n];
for (int i = 0; i < n; i++) {
scanf("%d %d %d", &stu[i].id, &stu[i].chinese, &stu[i].math);
}
merge_sort(stu, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d\n", stu[i].id);
}
return 0;
}
void merge_sort(Student arr[], int l, int r) {
if (l >= r) {
return;
}
int mid = l + (r - l) / 2;
merge_sort(arr, l, mid);
merge_sort(arr, mid + 1, r);
merge(arr, l, mid, r);
}
void merge(Student arr[], int l, int mid, int r) {
int n1 = mid - l + 1;
int n2 = r - mid;
Student L[n1], R[n2];
for (int i = 0; i < n1; i++) {
L[i] = arr[l + i];
}
for (int i = 0; i < n2; i++) {
R[i] = arr[mid + 1 + i];
}
int i = 0, j = 0, k = l;
while (i < n1 && j < n2) {
if (cmp(L[i], R[j]) > 0) {
arr[k++] = L[i++];
} else {
arr[k++] = R[j++];
}
}
while (i < n1) {
arr[k++] = L[i++];
}
while (j < n2) {
arr[k++] = R[j++];
}
}
int cmp(Student a, Student b) {
if (a.chinese != b.chinese) {
return b.chinese - a.chinese;
} else if (a.math != b.math) {
return b.math - a.math;
} else {
return a.id - b.id;
}
}
```
在本题中,我们使用归并排序来对学生信息进行排序,排序时按照语文成绩从大到小排序,若语文成绩相同则按照数学成绩从大到小排序,若数学成绩也相同则按照学号从小到大排序。最后输出排序后的所有同学学号即可。
阅读全文