首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【杭电oj】1872 - 稳定排序(结构体排序)

【杭电oj】1872 - 稳定排序(结构体排序)

作者头像
FishWang
发布2025-08-26 18:35:20
发布2025-08-26 18:35:20
10400
代码可运行
举报
运行总次数:0
代码可运行

稳定排序

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

代码语言:javascript
代码运行次数:0
运行
复制
   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

代码语言:javascript
代码运行次数:0
运行
复制
   Not Stable
cc 20
aa 10
bb 10
Right
Error
cc 20
aa 10
bb 10

Author

linle

Source

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

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

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

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 稳定排序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档