- 水王争霸
 - @ 2018-08-12 18:45:32
 
#include <iostream>
#include<string>
using std::string;
using std::cin;
using std::cout;
using std::endl;
int PARTITION(int p, int r);
void QUICKSORT(int p, int r);
string name[5000];  //储存水王ID
unsigned long long totcomments[5000]; //储存水王发帖数
int main()
{
    int totnum;  //水王总数
    cin>>totnum;
    int nail=0;// 标志,记录读取水王数据
    while(nail<totnum)
    {
        cin>>name[nail];
        cin>>totcomments[nail];
        nail++;
    }
    QUICKSORT(0, totnum-1);
    for(int i=totnum-1;i>=0;i--)
    {
        cout<<name[i]<<endl;
    }
    return 0;
}
int PARTITION(int p, int r)  //快速排序核心是找到分界点,因此对名字同样进行分解即可
{
    unsigned long long tip = totcomments[r];
    int i=p-1;
    for(int j=p;j<r;j++)
    {
        if(totcomments[j]<tip)
        {
            i=i+1;
            unsigned long long temp=totcomments[i];
            totcomments[i]=totcomments[j];
            totcomments[j]=temp;
string str=name[i];
            name[i]=name[j];
            name[j]=str;      //同时交换ID
        }
        else if(totcomments[j] == tip)
        {
            if(name[j]>name[r])
            {
                i=i+1;
                unsigned long long temp=totcomments[i];
                totcomments[i]=totcomments[j];
                totcomments[j]=temp;
string str=name[i];
                name[i]=name[j];
                name[j]=str;      //发帖数相同,同时交换ID,按字典顺序,注意输出倒序,因此大的ID在前
            }
        }
    }
    unsigned long long temp=totcomments[r];
    totcomments[r]=totcomments[i+1];
    totcomments[i+1]=temp;
string str=name[r];
    name[r]=name[i+1];
    name[i+1]=str;          //对姓名进行分界点交换,对发帖数排序同时保证对应ID跟着变化
    return i+1;
}
void QUICKSORT(int p, int r)
{
    if(p<r)
    {
      int q=PARTITION(p, r);
      QUICKSORT(p, q-1);
      QUICKSORT(q+1,r);
    }
}
经测试,即使所有发帖数相同,可以照字典序由小到大排序