结构体排序,重载运算符代替重写比较器(写cmp函数)
Ps:对于有多个比较变量的排序,可根据题意给变量设置权值。 如对日期进行排序 x年 y月 z日 可直接对 W=10000x+100y+z排序即可
#include<bits/stdc++.h>
using namespace std;
struct student{
char num[15];
int id;
int grade;
int ranks;
int idrank;
bool operator > (student a) {
if(a.grade == grade){
return strcmp(num, a.num)<0;
}
return grade > a.grade;
}
}stu[30010];
void Qsort( int low, int high){
if( !(low<high) ) return;
int l = low, r = high;
stu[0] = stu[l];
while(l<r){
while(l<r && stu[0]>stu[r]) r--;
stu[l] = stu[r];
while(l<r && stu[l]>stu[0]) l++;
stu[r] = stu[l];//cout << l << " " << r << endl;
}
stu[l] = stu[0];
Qsort(low , l-1);//递归
Qsort(l+1, high);//递归
}
int t, n, sum = 0;
int main(){
scanf("%d",&t);
for(int j = 1; j <= t; j++){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%s%d",&stu[i+sum].num, &stu[i+sum].grade);
stu[i+sum].id = j;
}
//sort(stu+sum+1, stu+sum+n+1, cmp);
Qsort(sum+1, sum+n);
int pre = stu[sum+1].grade, prerank = 1;
for(int i = 1; i <= n; i++){
if(stu[i+sum].grade == pre){
stu[i+sum].idrank = prerank;
}
else{
prerank=i;
stu[i+sum].idrank = prerank;
pre = stu[i+sum].grade;
}
}
sum += n;
}
//sort(stu+1, stu+sum+1, cmp);
Qsort(1, sum);
int pre = stu[1].grade, prerank = 1;
stu[1].ranks = 1;
for(int i = 2; i <= sum; i++){
if(stu[i].grade == pre){
stu[i].ranks = prerank;
}
else{
prerank=i;
stu[i].ranks = prerank;
pre = stu[i].grade;
}
}
printf("%d\n",sum);
for(int i = 1; i <= sum; i++){
printf("%s %d %d %d\n", stu[i].num, stu[i].ranks, stu[i].id, stu[i].idrank);
}
return 0;
}
仅供参考 切勿抄袭
hang hang hang !!!