• 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)
  • 相关阅读:
    Linux学习--线程概念
    菱形继承
    C++类型萃取
    Linux学习--进程创建
    Linux学习--进程概念
    比较全面的gdb调试命令
    再度理解原码、反码、补码
    详谈C++虚函数表那回事(多重继承关系)
    【sparkStreaming】将DStream保存在MySQL
    【sparkStreaming】kafka作为数据源的生产和消费
  • 原文地址:https://www.cnblogs.com/h-hkai/p/8538702.html
Copyright © 2020-2023  润新知