稳定的排序
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 73 Accepted Submission(s) : 12
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
我们知道,排序算法有很多种,不仅每种排序算法的复杂度不一样,而且每种排序算法的稳定性也不一定。稳定排序是指:待排序的记录序列中可能存在两个或两个以上关键字相等的记录。排序前的序列中Ri领先于Rj(即i<j).若在排序后的序列中Ri仍然领先于Rj,则称所用的方法是稳定的。否则是不稳定的。现给出一些字符串和其对应的权值。现要求依据权值升序排序,请你写一个程序输出稳定的排序结果。
例如:给定字符串和其对应的权值是:
abc 2
kdwycz 2
MummyDing 1
这里的权值即为关键字,由于abc和kdwycz对应的权值是相等的,但是排序前,abc排在kdwycz前面,那么排序后的abc也应该排在kdwycz的前面。
故稳定的排序结果为:
MummyDing 1
abc 2
kdwycz 2
而结果:
MummyDing 1
kdwycz 2
abc 2
虽然满足按权值升序排序的要求,但是其排序结果是不稳定的。
例如:给定字符串和其对应的权值是:
abc 2
kdwycz 2
MummyDing 1
这里的权值即为关键字,由于abc和kdwycz对应的权值是相等的,但是排序前,abc排在kdwycz前面,那么排序后的abc也应该排在kdwycz的前面。
故稳定的排序结果为:
MummyDing 1
abc 2
kdwycz 2
而结果:
MummyDing 1
kdwycz 2
abc 2
虽然满足按权值升序排序的要求,但是其排序结果是不稳定的。
Input
第一行是一个整数t表示有t组测试数据。
每组测试数据的第一行是一个整数n(n<=10^5)。
接下来有n行排序前的数据。
每行包含一个字符串s和一个权值w,以空格隔开。s的长度小于等于10,w的范围是[1,2^31-1]。
每组测试数据的第一行是一个整数n(n<=10^5)。
接下来有n行排序前的数据。
每行包含一个字符串s和一个权值w,以空格隔开。s的长度小于等于10,w的范围是[1,2^31-1]。
Output
输出稳定排序后的结果。
每组测试数据对应的输出结果包括n行。
每行输出一个字符串和其对应的权值,它们之间以一个空格隔开。
每组测试数据对应的输出结果包括n行。
每行输出一个字符串和其对应的权值,它们之间以一个空格隔开。
Sample Input
1 3 abc 2 kdwycz 2 MummyDing 1
Sample Output
MummyDing 1 abc 2 kdwycz 2
Author
JXNU_WY
大家在做的时候,我一直盯着榜在看,偶尔也看看代码。
主要错误有以下几种
1.没理解稳定排序。
2.直接用cin读取数据导致超时
其实题目挺简单的。
可以定义结构体
struct node
{
string s;//存字符串
int w,id;//w为权值,id为排序前的序号
}a[maxn];
自定义排序规则为
bool cmp(node x,node y)
{
if(x.w!=y.w) return x.w<y.w;//如果权值不相等就按照权值排序
return x.id<y.id;//相等就按排序前的序号排序。
}
错得比较多的就是直接这样定义排序规则
bool cmp(node x,node y)
{
return x.w<y.w;
}
出现这种问题的根本原因就没理解稳定的排序。
下面是参考代码
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100005;
struct node
{
string s;
int w,id;
}a[maxn];
bool cmp(node x,node y)
{
if(x.w!=y.w) return x.w<y.w;
return x.id<y.id;
}
int main()
{
int n,t;
cin.sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i].s>>a[i].w,a[i].id=i;
sort(a,a+n,cmp);
for(int i=0;i<n;i++) cout<<a[i].s<<" "<<a[i].w<<endl;
}
return 0;
}