这一版更直接,哪些情况不需要交换,把情况列举出来,return true,其他情况return false都需要交换,参考KY1成绩排序,成绩不同按成绩降序或升序排序,成绩相同按输入顺序排序,为了实现稳定排序,需要增加一个类似seq表示顺序的属性保证稳定性

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool isLetter(char c) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

// bool cmp(const pair<int, char>& a, const pair<int, char>& b) {
//     char lowerA = tolower(a.second);
//     char lowerB = tolower(b.second);
//     if (lowerA != lowerB) {
//         return lowerA < lowerB; // 按字母顺序排序
//     } else {
//         return a.first < b.first; // 字母相同时按原位置排序
//     }
// }

bool cmp(const pair<int, char>& a, const pair<int, char>& b){
    char lowerA = tolower(a.second);
    char lowerB = tolower(b.second);
    if(lowerA < lowerB){
        return true;
    }else if(lowerA == lowerB && a.first < b.first){
        return true;
    }else{
        return false;
    }
}

int main() {
    string input;
    while (getline(cin, input)) {
        vector<pair<int, char>> letters;
        // 提取所有字母及其位置
        for (int i = 0; i < input.size(); i++) {
            if (isLetter(input[i])) {
                letters.push_back({i, input[i]});
            }
        }
        // 按规则排序字母
        sort(letters.begin(), letters.end(), cmp);
        // 重构字符串
        int cnt = 0;
        for (int i = 0; i < input.size(); i++) {
            if (isLetter(input[i])) {
                input[i] = letters[cnt++].second;
            }
        }
        cout << input << endl;
    }
    return 0;
}
#include <cstdio>
#include <algorithm>
using namespace std;

struct Student {
    char name[50];
    int grade;
    int seq; // 记录录入的顺序,相同成绩都按先录入排列在前的规则处理
};

// 输入0代表降序
bool comp_0(Student lhs, Student rhs) {
    if (lhs.grade > rhs.grade) {
        return true;
    }
    else if (lhs.grade == rhs.grade && lhs.seq < rhs.seq) {
        return true;
    }
    else // seq越大,说明来得越晚,如果与前面成绩相同,不予交换
        return false;
}

// 输入1代表升序
bool comp_1(Student lhs, Student rhs) {
    if (lhs.grade < rhs.grade) {
        return true;
    }
    else if (lhs.grade == rhs.grade && lhs.seq < rhs.seq) {
        return true;
    }
    else
        return false;
}

int main() {
    int N, order;
    Student arr[10000];
    while (scanf("%d%d", &N, &order) != EOF) {
        int seq = 0;
        for (int i = 0; i < N; ++i) {
            scanf("%s%d", arr[i].name, &arr[i].grade);
            arr[i].seq = seq;
            ++seq; // 每次读取后自增
        }
        if (0 == order) {
            sort(arr, arr + N, comp_0);
        }
        else if (1 == order) {
            sort(arr, arr + N, comp_1);
        }
        for (int i = 0; i < N; ++i) {
            printf("%s %d\n", arr[i].name, arr[i].grade);
        }
    }
    return 0;
}