#PAT排名汇总问题。明天要上台讲这道题,这个代码是从网上找的,但是我一点也看不明白,排序是怎么排序的,希望老大们能帮我看看教教我

img

输入样例:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

输出样例
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

C++运行正确代码


#include<bits/stdc++.h>
#include<iostream>
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(){
    cin>>t;
    for(int j = 1; j <= t; j++){
        cin>>n;
        for(int i = 1; i <= n; i++){
            cin>>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;
        }
    }
    cout<<sum<<endl;
    for(int i = 1; i <= sum; i++){
        cout<<stu[i].num<<" "<<stu[i].ranks<<" "<<stu[i].id<<" "<<stu[i].idrank<<endl;
    }
    return 0;
}

建议学学快排 冒泡

最快的是timsort

Qsort建议不要用

很难理解的

我学了三四节课放弃了