【杭电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

智能推荐

程序员必学!Gradle源码全解析,看看这篇文章吧!_gradle 6.7.1源码分析-程序员宅基地

文章浏览阅读154次。背景惯例,先简单陈述一下自己的,91年生人,164年三本毕业后在深圳工作,末流小公司,工资13k,无房,无车,无户口。那时候感觉生活也还行,父母有退休金,我基本上不用太操心,女朋友在一起很久了,很体贴,没有怎么要求我。本来生活就这样一帆风顺下去我就满足了,但是去年初,女朋友家里出了一些事情,一点积蓄全给她了,后面疫情来了,家里开始催婚了,我感觉到了压力。目前的工资无法满足生活,虽然这些年来有一点点的提升,但是,房价物价涨的更快,于是我决定跳槽。从去年年底开始瞎投简历,回顾了一下,一共投了33份简历_gradle 6.7.1源码分析

关于Loadrunner并发组函数web_concurrent的注意事项_web_concurrent_start-程序员宅基地

文章浏览阅读5k次。web_concurrent_start函数是并发组开始的标记。组中所有的函数是并发执行的,并发组的结束符为web_concurrent_end 函数。在并发组中,可以包含的函数有:web_url、web_submit_data、web_custom_request、web_create_html_param、web_create_html_param_ex、web_reg_save_param、..._web_concurrent_start

Delphi dbgrideh序号_dbgrideh增加序号和箭头-程序员宅基地

文章浏览阅读267次。数据库里面的数据没有序号的数据,在dbgrideh上新增一列自定义其字段,例如:id。在dbgrideh控件上的‘OnDrawColumnCell’事件下写下代码。在unidatesource的‘OnDataChange’事件下写下。if DataCol = 0 then //设置在第一列。在编码的开头定义i,为integer。_dbgrideh增加序号和箭头

samber/lo 库的使用方法: 处理切片-程序员宅基地

文章浏览阅读1.4k次,点赞27次,收藏26次。是一个 Go 语言库,提供了一些常用的集合操作函数,如 Filter、Map 和 FilterMap。这个库函数太多,因此我决定按照功能分别介绍,本文介绍的是 samber/lo 库中处理切片的函数。主要参考库的README。_samber/lo

verilog乘法器以及booth编码改进_改进booth编码-程序员宅基地

文章浏览阅读4.6k次,点赞7次,收藏28次。第一章 整数乘法器1.1 整数的概念整数在IEEE 的规定上有,短整数short integer , 中整数integer 和 长整数long integer ,它们之间的关系如下: 整数字节空间取值范围短整数一个字节-127 ~ 127中整数两个字节-32767~32767长整数和四个字节-2147483647~2147483647 在这里笔者以短整数..._改进booth编码

C语言课程笔记知识总结与感想_c语言知识点感想-程序员宅基地

文章浏览阅读1.3k次。 C数据类型。{常量与变量}第2章常量:整型常量: 有符号整型常量:默认int定义为有符号整数,无需使用signed. 无符号整型常量:不能表示成小于零的数。 长整型常量。 无符号长整型常量。 实型..._c语言知识点感想

随便推点

.Net自定义控件 小结_.net自定义控件需要熟悉哪些东西-程序员宅基地

文章浏览阅读1.1k次。以下内容为转载:写在前面: .Net已经成为许多软件公司的选择,而.Net自定义WinForm界面控件,也成为编程的热点,越来越多的程序员会开发自己需要的自定义界面控件.小作坊网介绍了多种自定义的界面控件,基本了包括了日常所需的各种基本控件,介绍的自定义控件,都对原有的界面控件作了扩展,使之更适用了系统或更美观.下面作一个小结:.Net自定义控件之WinForm的经典O_.net自定义控件需要熟悉哪些东西

TCP版本之TCP Tahoe 和TCP Reno-程序员宅基地

文章浏览阅读6k次。实验目的学习TCP的拥塞控制机制,并了解TCP Tahoe 和 TCP Reno的运行方式。基础知识回顾TCP/IP (Transmission Control Protocol/Internet Protocol)是目前使用最广泛的一组通信协议。TCP所负责的功能包括:将自应用程序收到的信息分成许多较小的数据区段、提供连接导向的服务、提供可靠性服务、提供应用程序与应用和式之间的流量..._tcp reno

Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器-程序员宅基地

文章浏览阅读1.7k次,点赞13次,收藏30次。最近在学习 Android MediaCodec 相关的知识,准备开个新坑把学习过程记录下来,总结成 MediaCodec 教程。在介绍 MediaCodec 编解码之前,让我们学习一些其他与之配套的组件,今天要讲的是。提示:以下是本篇文章正文内容,下面案例可供参考本文介绍了 MediaCodecList 的基本使用方法,并展示了如何使用 MediaCodecList 来创建 MediaCodec 编解码器。_mediacodeclist

内网穿透 篇四:通过 Cloudflare Tunnel 内网穿透 实现公网访问内网服务-程序员宅基地

文章浏览阅读773次,点赞18次,收藏3次。通过 Cloudflare Tunnel,我们可以直接把内网搭建的服务穿透到公网上,与 frp 不同的是,Cloudflare Tunnel 并不需要购买有公网 IP 的服务器,直接通过 Cloudflare 就可以完成穿透,并且还能使用 80/443 端口。一个域名 (6-9位纯数字的 xyz 域名只需 0.67 美元一年)一张双币信用卡或。

QT 如何把外部程序嵌入到QT界面_qt嵌入外部程序-程序员宅基地

文章浏览阅读5.4k次,点赞4次,收藏52次。一个奇怪但又合乎现实需要的需求,就是把外部程序嵌入到本窗口内,实现外部程序在本窗口的显示。可能外部程序是由其他人开发的,但是想“拿来”作为内部使用,于是乎想把外部程序嵌入到本程序窗口内,让他们更像是一个整体。更有甚者,也可以实现外部程序与本程序之间的通讯。_qt嵌入外部程序

苍穹外卖day8(2)用户下单、微信支付

用户下单因为订单信息中包含了其他业务中的数据,在逻辑处理中涉及了多个其他业务,比如要判断地址簿、购物车数据是否为空(查询地址簿和购物车)订单表字段多,在插入数据的时候,要确保每个字段都有值向订单表插入数据后,也得向订单明细表插入数据:具体来说,就是遍历购物车数据,把购物车中的商品详细信息(菜品、套餐、数量、价格…)赋给订单详情表完成下单后要清空购物车订单支付需要商家号,跳过支付,模拟实现订单支付功能。

推荐文章

热门文章

相关标签