这一版更直接,哪些情况不需要交换,把情况列举出来,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; }