稳定排序

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;
}

HDU1872 稳定排序【稳定排序】相关推荐

  1. 选择排序稳定吗_最常见的四种数据结构排序算法你不知道?年末怎么跳槽涨薪...

    前言 在学习数据结构的时候必然接触过排序算法,而且在日常开发中相信排序算法用得也比较多.而排序算法众多,各个效率又不同,难以记住.小编今天会介绍一些常用排序算法的特点和实现,对比不同排序算法的效率. ...

  2. 计数排序和稳定的计数排序

    计数排序不是基于元素比较,而是利用数组下标来确定元素的正确位置.计数排序是一个稳定的排序算法.当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k),空间复杂度也是O(n+k),其排 ...

  3. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  4. 【数据结构-排序】1. 图解插入排序三种实现(插入排序/折半排序/希尔排序)

    直接插入排序(插入排序) 排序思想 对于一个数组 A[0,n] 的排序问题,假设认为数组在 A[0,n-1] 排序的问题已经解决了. 考虑 A[n] 的值,从右向左扫描有序数组 A[0,n-1] ,直 ...

  5. python 排序_Python 排序了解一下?

    脚本之家 你与百万开发者在一起 文 | 潮汐 来源:Python 技术「ID: pythonall」 排序是每个开发人员都需要掌握的技能.排序是对程序本身有一个全面的理解.不同的排序算法很好地展示了算 ...

  6. 倒序排序_排序算法(六):Counting Sort 计数排序

    之前文章介绍的一些排序算法都是基于比较来进行排序的,故它们在平均情况下的时间复杂度最好也不过是线性对数级别.这里我们来介绍一种简单的基于非比较的排序算法--Counting Sort 计数排序,其时间 ...

  7. 堆排序算法c语言筛选法,【排序】排序算法之选择排序

    排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...

  8. 算法-排序-k排序(算法导论第三版第八章思考题8-5)

    算法-排序-k排序 算法导论第三版第八章思考题8-5 时间复杂度Θ(nlg(n/k)). 利用最小堆完成,把元素分成k个堆,每个堆大小⌈n/k⌉. 利用堆作为子排序稳定,也可以采用其他排序作为子排序, ...

  9. 排序上---(排序概念,常见排序算法,直接插入,希尔排序,直接选择排序,堆排序)

    排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对 ...

  10. java基础排序_Java排序算法-Java入门|Java基础课程

    1. 课程目标排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2 ...

最新文章

  1. 小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util
  2. 洛谷 - P2764 最小路径覆盖问题(最大流+二分图最小路径覆盖+路径打印)
  3. 互联网日报 | 3月22日 星期一 | 苹果iMac Pro全球下架;知乎更新上市招股书;字节跳动成立朝夕光年奇想基金...
  4. Android Studio 4.0 发布
  5. C/C++百题打卡[5/100]——合唱队形
  6. 急先锋开宝箱问题(Java实现)
  7. 过账期间未清和关帐过帐期间设置
  8. 计算机上下打字怎么打,电脑打字符号怎么打底下的一横
  9. 实现两个主机之间的密钥分发和安全传输
  10. android chrome无法运行,Android 测试 Chrome 浏览器能正常启动 Chrome 浏览器,但是不能进行操作,求大神!!...
  11. python学习---day6
  12. 实习日志_2022/3/11
  13. GreeNC:植物lncRNA数据库
  14. KY-RTI分布仿真技术:前言
  15. c语言马踏棋盘编程分析,C语言马踏棋盘实现
  16. 用聚类算法计算股票的支撑位和阻力位
  17. 关于ssdp局域网发现
  18. 项目七 网络打印的配置与管理
  19. 支付宝上传rea2 公钥
  20. Ansible 学习总结(3)—— Ansible 常用模块与 playbook 实例讲解

热门文章

  1. 2022-03-21 转载办公室之常用职位(英汉)
  2. 2021-11-24 摘抄:软件产品的一些功能和性能指标
  3. SQL那些事儿(九)--oracle数据库知识体系
  4. AppCan VS PhoneGap - 对比两大移动开发平台
  5. vue回调函数this指向问题
  6. Spark常用算子讲解一
  7. uniapp全局传值方式总结
  8. HTML网页实训的目的,网页设计实习目的及意义.doc
  9. linux内核串口调试,linux 串口调试方法
  10. php 封装模式,PHP设计模式(三):封装