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