题意:
输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。
例示:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
注:0代表从高到低,1代表从低到高
方法一:
结构体稳定快排
思路:首先,定义一个结构体,包含用户和成绩;
重写升序和降序两个函数,
最后根据题意要求实现升序或降序的稳定排序。
#include <bits/stdc++.h> using namespace std; struct node{ string name; int score; }a[205]; bool cmp1(const node& x,const node& y){ return x.score<y.score;//成绩从小到大排序 } bool cmp2(const node& x,const node& y){ return x.score>y.score;//成绩从大到小排序 } int main(){ int n,m; cin >> n >> m; for(int i=0;i<n;i++){ cin >> a[i].name >> a[i].score; } if(m==1) stable_sort(a,a+n,cmp1); else stable_sort(a,a+n,cmp2); for(int i=0;i<n;i++){ cout << a[i].name << " " << a[i].score << endl; } return 0; }
时间复杂度:空间复杂度:
方法二:
桶排序(稳定排序)
思路:桶排序,(即下标与数值的映射关系)。
因为成绩的区间在0到100,所以可以初始化101个桶。
遍历输入,之后根据题意要求实现升序或降序的输出即可。
#include <bits/stdc++.h> using namespace std; vector<string> a[105]; string name; int score; int main(){ int n,m; cin >> n >> m; for(int i=0;i<n;i++){ cin >> name >> score; a[score].push_back(name); } if(m==0){//降序 for(int i=100;i>=0;i--){ for(int j=0;j<a[i].size();j++){ cout << a[i][j] << " " << i << endl; } } }else{//升序 for(int i=0;i<=100;i++){ for(int j=0;j<a[i].size();j++){ cout << a[i][j] << " " << i << endl; } } } return 0; }
时间复杂度:空间复杂度: