2015 年 JXNU_ACS 算法组寒假第一次周赛 1002 稳定的排序

稳定的排序

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
虽然满足按权值升序排序的要求,但是其排序结果是不稳定的。

Input

第一行是一个整数t表示有t组测试数据。
每组测试数据的第一行是一个整数n(n<=10^5)。
接下来有n行排序前的数据。
每行包含一个字符串s和一个权值w,以空格隔开。s的长度小于等于10,w的范围是[1,2^31-1]。

Output

输出稳定排序后的结果。
每组测试数据对应的输出结果包括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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值