题解 | 成绩排序
成绩排序
https://www.nowcoder.com/practice/0383714a1bb749499050d2e0610418b1
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Stu {
public:
string name;
int rank;
Stu(string n, int r) {
this->name = n;
this->rank = r;
}
Stu() {
}
};
vector<Stu> tem(1000); //辅助数组
void mS(vector<Stu>& s, int l, int r, int order) { //归并排序
if (l >= r)
return;
int mid = (l + r)>> 1;
mS(s, l, mid, order);
mS(s, mid + 1, r, order);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r) {
if (order == 1) { //升序
if (s[i].rank <= s[j].rank) {
tem[k++] = s[i++];
} else {
tem[k++] = s[j++];
}
} else { //降序
if (s[i].rank >= s[j].rank) {
tem[k++] = s[i++];
} else {
tem[k++] = s[j++];
}
}
}
while (i <= mid)
tem[k++] = s[i++];
while (j <= r)
tem[k++] = s[j++];
for (int i = l, k = 0; i <= r; i++, k++) {
s[i] = tem[k];
}
}
int main() {
int n, order;
while (scanf("%d%d", &n, &order) != EOF) {
vector<Stu> s;
for (int i = 0; i < n; i++) {
string name;
int rank;
cin >> name >> rank;
s.push_back(Stu(name, rank));
}
mS(s, 0, s.size() - 1, order);
for (int i = 0; i < s.size(); i++) {
cout << s[i].name << " " << s[i].rank << endl;
}
}
}

