【杭电oj】1872 - 稳定排序(结构体排序)_wygoj-程序员宅基地

技术标签: 排序  

稳定排序

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


Problem Description
大家都知道,快速排序是不稳定的排序方法。
如果对于数组中出现的任意a[i],a[j](i<j),其中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



对于不稳定的排序,只是名字变了,分数不会变,所以用两个bool型的变量分别判断是否正确排序和是否稳定排序。

如果名字不正确但分数相同则不稳定排序,如果分数不正确就说明排序错误。


代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
	char name[55];
	int grade;
	int num;
}a[311];
bool cmp(node a,node b)
{
	if (a.grade != b.grade)
		return a.grade > b.grade;
	else
		return a.num < b.num;
}
int main()
{
	int n;
	bool flag1;		//是否正确排序 
	bool flag2;		//是否稳定排序 
	while (~scanf ("%d",&n))
	{
		flag1 = flag2 = true;
		for (int i = 0 ; i < n ; i++)
		{
			scanf ("%s %d",a[i].name,&a[i].grade);
			a[i].num = i;
		}
		sort (a,a+n,cmp);
		for (int i = 0 ; i < n ; i++)
		{
			char t1[55];
			int t2;
			scanf ("%s %d",t1,&t2);
			if (t2 != a[i].grade)
				flag1 = false;
			else if (strcmp (t1,a[i].name) != 0)
				flag2 = false;
		}
		if (!flag1)		//错误排序
		{
			printf ("Error\n");
			for (int i = 0 ; i < n ; i++)
				printf ("%s %d\n",a[i].name,a[i].grade);
		}
		else
		{
			if (flag2)
				printf ("Right\n");
			else
			{
				printf ("Not Stable\n");
				for (int i = 0 ; i < n ; i++)
					printf ("%s %d\n",a[i].name,a[i].grade);
			}
		}
	}
	return 0;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wyg1997/article/details/51168846

智能推荐

针对开发的项目的个人NABC-程序员宅基地

文章浏览阅读84次。首先我们的创意是结合我们所学的专业知识,由于每次周在野外进行大地测量实习的时候关于计算问题有遇到很多问题,对于手算,有可能会出现人为错误,再次回去重新计算,会浪费大量时间,而且会很麻烦,也不一定会完全正确。N(need)需求1对功能的规定1.1精度符合测量规范1.2满足的要求我们的创意将会满足测量的同学对于导线和水准测量方面的计算问题。1.3对与已有的软件有些方面比如..._nabc项目表格

编译原理—LR(0)分析表的构造(C++实现)_lr(0) c++-程序员宅基地

文章浏览阅读946次。构造识别活前缀的DFA若A->a.Bb属于 CLOSURE(I), 则每一个形如B->.r的项目也属于CLOSURE(I)根据DFA构建LR(0)分析表。_lr(0) c++

DHCP源码分析-系统概述_isc-dhcp-server源码-程序员宅基地

文章浏览阅读3.9k次。先名词解释下: DHCP:动态主机配置协议(Dynamic Host Configuration Protocol),是一个局域网的网络协议,使用UDP协议工作。它的前身是BOOTP(Bootstrap Protocol)初始引导协议。 BOOTP则可以自动地为那些主机设定TCP/IP环境。但BOOTP有一个缺点:您在设定前须事先获得客户端的硬体位址,而且,与IP的_isc-dhcp-server源码

算法数据结构——记忆化搜索(Memoization Search)算法超详细总结加应用案例讲解-程序员宅基地

文章浏览阅读5.4k次,点赞11次,收藏54次。记忆化搜索(Memoization Search):是一种通过存储已经遍历过的状态信息,从而避免对同一状态重复遍历的搜索算法。记忆化搜索是动态规划的一种实现方式。在记忆化搜索中,当算法需要计算某个子问题的结果时,它首先检查是否已经计算过该问题。如果已经计算过,则直接返回已经存储的结果;否则,计算该问题,并将结果存储下来以备将来使用。举个例子,比如「斐波那契数列」的定义是:$f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)$。_记忆化搜索

ssm/php/node/python学生学习平台-程序员宅基地

文章浏览阅读775次,点赞22次,收藏21次。分析d96d6平台的功能和特色,能够帮助学生识别和选择最适合自己的学习资源,从而在学习过程中实现个性化发展。在长远来看,这种对学习平台的研究和应用,将对学生终身学习能力的培养产生积极影响,为他们未来的学术发展和职业生涯打下坚实的基础。其中,d96d6作为一个新兴的学生学习平台,它集成了丰富的教学资源、互动工具和个性化学习方案,旨在为学生提供一个高效、便捷的学习环境。然而,面对众多学习平台的竞争,如何准确理解d96d6平台的特点和优势,以及如何在该平台上有效学习,成为了学生们普遍关心的问题。

谷歌浏览器怎么长截图怎么截_Google浏览器如何截取网页长图 - 里维斯社-程序员宅基地

文章浏览阅读2.9k次。前面我们介绍过类似浏览器截取长图的方法和工具,但是对于Google浏览器来说都不太好用。今天我们从网上搜集整理了一些适用于Google浏览器截取网页长图的方法。往期截图长图的方法和工具可以前往阅读:截图的快捷键、工具、方法有很多,譬如我们通常使用QQ自带的截图工具(快捷键Ctrl+Alt+A)、360极速浏览器自带的截图工具(快捷键Ctrl+M),还有键盘上的截图按键(PetScranton)等。..._谷歌浏览器长截图

随便推点

百万级访问网站前期的技术准备(网络转贴)-程序员宅基地

文章浏览阅读50次。开了自己域名的博客,第一篇就得来个重磅一点的才对得起这4美金的域名。作为一个技术从业者十年,逛了十年发现有些知识东一榔头西一棒槌的得满世界 看个遍才整理出个头绪,那咱就系统点的从头一步一步的说,一个从日几千访问的小小网站,到日访问一两百万的小网站,怎么才能让它平滑的度过这个阶段,别在 技术上出..._如何访问1-100的网站

Asp.NetCore3.1开源项目升级为.Net6.0-程序员宅基地

文章浏览阅读1.8k次。概述自从.Net6.0出来后,一直想之前开发的项目升级.Net6.0,有时想想毕竟中间还跨了个5.0版本,升级起来不知道坑大不大,最近抽时间对升级的方案做了些研究,然后将代码升级为.Net..._.asp.net mvc升级到.net6

AndroidStudio案例——简单计算器_android studio计算器-程序员宅基地

文章浏览阅读2.0w次,点赞44次,收藏414次。设计一款带有可视化界面的简单计算器,供用户输入数据并查看结果。用户通过点击相应按钮(加减乘除运算符、等号、数字)输入正确的表达式,计算器进行相应的加减乘除运算,且可以进行小数和整数的运算;长按清除按钮3秒,可以清除已录入的内容。在Layout文件夹中建立布局文件,完成计算器界面的网格布局设计,包括了一个文本编辑框和17个按钮。为每一个按钮编写单击事件,实现对应功能;点击数字和加减乘除按钮实现表达式的录入,并显示在TextView中;点击等号按钮,根据表达式计算结果;长按清除按钮3。_android studio计算器

Jmeter3.2监控系统资源问题-程序员宅基地

文章浏览阅读345次。今天用了一下最新版的Jmeter3.2,在进行系统资源监控的时候加入JMeterPlugins-Extras-1.4.0和JMeterPlugins-Standard-1.4.0两个jar包,但是启动执行就报错去报错的类中查找了一下确实没有这个方法。至于jmeter3.2怎么能够正确的监控系统资源现在还不知道,但是造成报错的原因估计是因为JMeterPlugins-Extras-1_jmeter3.2监控系统资源

数据库开发工程师&岗位职责and技能要求_数据开发工程师的职责和技能-程序员宅基地

文章浏览阅读8.2k次,点赞5次,收藏44次。数据库开发工程师主要职责深入研究数据库内核相关技术,设计并实现数据库管理系统深入了解数据库应用的业务需求,主导设计不同数据库架构的应用软件,并持续优化根据业务需求设计数据库逻辑和物理模型, 开发数据库生产环境所需要的存储过程、函数、脚本等参与数据库生产环境的问题优化和解决探索、研究新的数据库架构发展方向工作内容数据库开发工程师的日常工作是设计、开发数据库系统和数据库应用软件,因..._数据开发工程师的职责和技能

C语言输出浮点数_printf输出浮点数-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏2次。好,我们一起来看这个程序,这个程序是C语言程序,先把函数头ST tio点h,给写完以后再把main函数,给写出来以后,我们再用float,这个是专门来输出浮点数的,只不过这个是单精度,然后我们命名一个变量ff=12点001234,然后我们再用printf进行输出,注意输出的时候百分号后面要加f,而不是dd表示的是整数,f表示的是浮点数,我们今后还会学到双精度,也就是double这期再见,关注我下期更精彩。_printf输出浮点数