E - 稳定排序(结构体)
大家都知道,快速排序是不稳定的排序方法。
如果对于数组中出现的任意a[i],a[j](i<j),其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排序是稳定的。
某高校招生办得到一份成绩列表,上面记录了考生名字和考生成绩。并且对其使用了某排序算法按成绩进行递减排序。现在请你判断一下该排序算法是否正确,如果正确的话,则判断该排序算法是否为稳定的。
如果对于数组中出现的任意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\n"); 61 else if(flag1 && !flag2) 62 { 63 printf("Not Stable\n"); 64 for(int i = 0; i < n; i++) 65 printf("%s %d\n", student[i].name, student[i].score); 66 } 67 else if(!flag1 && !flag2) 68 { 69 printf("Error\n"); 70 for(int i = 0; i < n; i++) 71 printf("%s %d\n", student[i].name, student[i].score); 72 } 73 } 74 75 return 0; 76 }
永远渴望,大智若愚(stay hungry, stay foolish)