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

稳定排序

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
2008浙大研究生复试热身赛(2)——全真模拟



对于不稳定的排序,只是名字变了,分数不会变,所以用两个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;
}


你可能感兴趣的:(【杭电oj】1872 - 稳定排序(结构体排序))