HDU1872 稳定排序【稳定排序】

稳定排序

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10289 Accepted Submission(s): 3742

Problem Description
大家都知道,快速排序是不稳定的排序方法。
如果对于数组中出现的任意a[i],aj,其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排序是稳定的。

某高校招生办得到一份成绩列表,上面记录了考生名字和考生成绩。并且对其使用了某排序算法按成绩进行递减排序。现在请你判断一下该排序算法是否正确,如果正确的话,则判断该排序算法是否为稳定的。

Input
本题目包含多组输入,请处理到文件结束。
对于每组数据,第一行有一个正整数N(0<N<300),代表成绩列表中的考生数目。
接下来有N行,每一行有一个字符串代表考生名字(长度不超过50,仅包含’a’~‘z’),和一个整数代表考生分数(小于500)。其中名字和成绩用一个空格隔开。
再接下来又有N行,是上述列表经过某排序算法以后生成的一个序列。格式同上。

Output
对于每组数据,如果算法是正确并且稳定的,就在一行里面输出"Right"。如果算法是正确的但不是稳定的,就在一行里面输出"Not Stable",并且在下面输出正确稳定排序的列表,格式同输入。如果该算法是错误的,就在一行里面输出"Error",并且在下面输出正确稳定排序的列表,格式同输入。

注意,本题目不考虑该排序算法是错误的,但结果是正确的这样的意外情况。

Sample Input
3
aa 10
bb 10
cc 20
cc 20
bb 10
aa 10
3
aa 10
bb 10
cc 20
cc 20
aa 10
bb 10
3
aa 10
bb 10
cc 20
aa 10
bb 10
cc 20

Sample Output
Not Stable
cc 20
aa 10
bb 10
Right
Error
cc 20
aa 10
bb 10

Author
linle

Source
2008浙大研究生复试热身赛(2)——全真模拟

问题链接HDU1872 稳定排序
问题简述:用稳定排序对一组数据进行排序,比较排序结果与快速排序的结果,并输出规定的结果。
问题分析
    稳定排序有关概念如下:
稳定排序定义:给定序列中两个相等的数,经过排序之后,其在序列中的前后位置顺序不变。(Ai=Aj,排序前Ai在Aj前面,排序后Ai还在Aj前面)。
稳定排序意义:避免不必要的排序操作,如果序列中的2个数据相同的话。
    稳定排序分类如下:
稳定排序算法:冒泡排序,插入排序、归并排序、基数排序
不稳定性排序算法:选择排序、快速排序、希尔排序、堆排序

    C++的STL中含有稳定排序算法函数stable_sort()。这个题中,用该函数算出排序结果,再进行比较。似乎STL中的排序算法函数sort()也是采用了稳定排序算法。

    如果想观察排序是不是稳定排序,题解程序中,可以在结构Student中增加成员id。
程序说明:(略)
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

/* HDU1872 稳定排序 */

#include <bits/stdc++.h>

using namespace std;

const int N = 300;
const int L = 50;
struct Student {
//    int id;
    char name[L + 1];
    int score;
} s[N], a[N];

bool cmp(const Student &a, const Student b)
{
    return a.score > b.score;
}

int main()
{
    int n;
    while(~scanf("%d", &n)) {
        for(int i = 0; i < n; i++) {
//            s[i].id = i;
            scanf("%s", s[i].name);
            scanf("%d", &s[i].score);
        }
        for(int i = 0; i < n; i++) {
//            a[i].id = i;
            scanf("%s", a[i].name);
            scanf("%d", &a[i].score);
        }

        stable_sort(s, s + n, cmp);

        int cnt1 = 0, cnt2 = 0, ans;
        for(int i = 0; i < n; i++) {
            if(s[i].score == a[i].score) cnt1++;
            if(strcmp(s[i].name, a[i].name) == 0) cnt2++;
        }
        if(cnt1 == n && cnt2 == n) ans = 1;
        else if(cnt1 == n && cnt2 != n) ans = 2;
        else ans = 3;

        if(ans == 1) printf("Right\n");
        else {
            if(ans == 2) printf("Not Stable\n");
            else if(ans == 3) printf("Error\n");
            for(int i = 0; i < n; i++)
                printf("%s %d\n", s[i].name, s[i].score);
        }
    }

    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值