- 水王争霸
- 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);
}
}
经测试,即使所有发帖数相同,可以照字典序由小到大排序