#include <iostream>
#include <ostream>
using namespace std;
//倒序输入,倒序输出
void bubble_sort01(int* score, int* name, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (score[j] < score[j + 1]) {
swap(score[j], score[j + 1]);
swap(name[j],name[j+1]);
}
}
}
}
//正序输入,正序输出
void bubble_sort02(int* score, int* name, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (score[j] > score[j + 1]) {
swap(score[j], score[j + 1]);
swap(name[j],name[j+1]);
}
}
}
}
int score[105];
int name[105];
int main() {
int n;
while (cin >> n) { // 注意 while 处理多个 case
for(int k=0;k<n;k++){
cin>>name[k]>>score[k];
}
if(n>1 && name[0]<name[1]){
bubble_sort02(score, name,n);
for(int k=0;k<n;k++){
cout<<name[k]<<" "<<score[k]<<endl;
}
}
if(n>1 && name[0]>name[1]){
bubble_sort01(score, name,n);
for(int k=n-1;k>=0;k--){
cout<<name[k]<<" "<<score[k]<<endl;
}
}
if(n==1)cout<<name[0]<<" "<<score[0]<<endl;
}
}
// 64 位输出请用 printf("%lld")
解题思路:没有用到结构体;用了普通的排序算法,因为要保证学号顺序不能乱,因此需要用一个稳定的排序算法,我是用的冒泡排序;
关键点:题目要求按成绩从小到大的顺序输出;如果成绩相同,则按照学号的大小进行从小到大排序;此处就会分两种情况:
①输入是按学号升序输入的:直接按照成绩的升序排序,然后正常输出即可;
②输入是按学号降序输入的:此时如果你按照成绩的升序排序的话,相同成绩的学号顺序是从大到小的,与题目要求正好相反;因此需要采用降序排序,然后输出数组时从后往前输出;
注意⚠️:冒泡排序中,第一层循环是从0到n-1;第二层循环是从0到n-1-i;
建议掌握(会默写)至少两种排序算法,一种稳定的例如冒泡,一种速度比较快的快排(但不稳定);
归并排序是又快有稳定的;

京公网安备 11010502036488号