E

大家都知道,快速排序是不稳定的排序方法。 
如果对于数组中出现的任意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

题解:先按照题目要求,写出稳定排序,(注意这里是如果分数相同则按照先出现的排在前面,而不是按照姓名的字典序进行排列),然后再进行比较即可。

AC代码

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 struct nood
 7 {
 8     char name[55];
 9     int score;
10     int data;
11 } student[3300], solution[3300];
12 
13 bool cmp(nood a, nood b)
14 {
15     if(a.score == b.score)
16     {
17         return a.data < b.data;
18     }
19     else
20     {
21         return a.score > b.score;
22     }
23 }
24 
25 int main()
26 {
27     int n;
28     bool flag1, flag2;
29     while(~scanf("%d", &n))
30     {
31         flag1 = flag2 = true;
32         for(int i = 0; i < n; i++)
33         {
34             scanf("%s %d", student[i].name, &student[i].score);
35             student[i].data = i;
36         }
37         for(int i = 0; i < n; i++)
38         {
39             scanf("%s %d", solution[i].name, &solution[i].score);
40         }
41         sort(student, student+n, cmp);
42         for(int i = 0; i < n; i++)
43         {
44             if(solution[i].score != student[i].score)
45             {
46                 flag1 = false;
47                 break;
48             }
49         }
50         for(int i = 0; i < n; i++)
51         {
52             int name_cmp = strcmp(solution[i].name, student[i].name);
53             if(name_cmp)
54             {
55                 flag2 = false;
56                 break;
57             }
58         }
59         if(flag1 && flag2)
60             printf("Right
");
61         else if(flag1 && !flag2)
62         {
63             printf("Not Stable
");
64             for(int i = 0; i < n; i++)
65                 printf("%s %d
", student[i].name, student[i].score);
66         }
67         else if(!flag1 && !flag2)
68         {
69             printf("Error
");
70             for(int i = 0; i < n; i++)
71                 printf("%s %d
", student[i].name, student[i].score);
72         }
73     }
74 
75     return 0;
76 }
View Code
永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/8538702.html