zoukankan      html  css  js  c++  java
  • HDU--1872 稳定排序

    大家都知道,快速排序是不稳定的排序方法。 
    如果对于数组中出现的任意aii,ajj(i<j),其中aii==ajj,在进行排序以后aii一定出现在ajj之前,则认为该排序是稳定的。 

    某高校招生办得到一份成绩列表,上面记录了考生名字和考生成绩。并且对其使用了某排序算法按成绩进行递减排序。现在请你判断一下该排序算法是否正确,如果正确的话,则判断该排序算法是否为稳定的。 
    Input
    本题目包含多组输入,请处理到文件结束。 
    对于每组数据,第一行有一个正整数N(0<N<300),代表成绩列表中的考生数目。 
    接下来有N行,每一行有一个字符串代表考生名字(长度不超过50,仅包含'a'~'z'),和一个整数代表考生分数(小于500)。其中名字和成绩用一个空格隔开。 
    再接下来又有N行,是上述列表经过某排序算法以后生成的一个序列。格式同上。
    Output
    对于每组数据,如果算法是正确并且稳定的,就在一行里面输出"Right"。如果算法是正确的但不是稳定的,就在一行里面输出"Not Stable",并且在下面输出正确稳定排序的列表,格式同输入。如果该算法是错误的,就在一行里面输出"Error",并且在下面输出正确稳定排序的列表,格式同输入。 

    注意,本题目不考虑该排序算法是错误的,但结果是正确的这样的意外情况。
    Sample Input
       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

    题意:
    sort直接排序可能存在不稳定性
    题解:
    分数不相同直接sort从高到低排序,分数如果相同,按输入名字的id的先后顺序排(这里不是按字典序排,是按名字出现的先后,即刚开始在前,排后也在前。“这个地方迷失了好久好久,当成了字典序排序...”)
    AC代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 struct stu
     6 {  int id; 
     7    char num[51];
     8    int score;
     9 }p[300],q[300];
    10 bool cmp(stu x,stu y)
    11 {
    12    if(x.score!=y.score)
    13        {if(x.score>y.score)
    14           return true;
    15         else return false;   
    16         }
    17    else 
    18     {if(x.id<y.id)
    19        return true;
    20       else return false;  
    21       
    22     }  
    23 }
    24 int main()
    25 {
    26 int n,i,j,k;
    27 while(scanf("%d",&n)!=EOF)
    28   {for(i=0;i<n;i++)
    29      {scanf("%s %d",p[i].num,&p[i].score);
    30       p[i].id=i;     
    31      }
    32    for(i=0;i<n;i++)
    33      scanf("%s %d",q[i].num,&q[i].score);  
    34    sort(p,p+n,cmp);
    35    j=0;
    36    k=0;
    37 
    38    for(i=0;i<n;i++)
    39     {if(strcmp(p[i].num,q[i].num)==0) 
    40       j++;
    41       if(p[i].score==q[i].score)       
    42       k++;                                                           
    43     }
    44    if(j==n&&k==n) printf("Right
    ");  
    45     else if(k==n&&j!=n) 
    46    {printf("Not Stable
    ");
    47     for(i=0;i<n;i++)
    48     printf("%s %d
    ",p[i].num,p[i].score);
    49    } 
    50    else  
    51    {printf("Error
    ");
    52     for(i=0;i<n;i++)
    53     printf("%s %d
    ",p[i].num,p[i].score);
    54        
    55    }
    56   }
    57 return 0;
    58 }



     
  • 相关阅读:
    Java基础笔记(九)—— 流程控制
    Java基础笔记(七)—— 成员变量、静态变量、局部变量
    Java基础笔记(六)——进制表示、ASCII码和Unicode编码
    Java基础笔记(五)——数据类型转换
    Java基础笔记(四)——命名规则、数据类型
    java基础笔记(三)——main方法
    Java基础笔记(二)——配置环境变量
    原始生物 题解
    Ant Trip 题解
    叶子清除计划【第五周】 题解
  • 原文地址:https://www.cnblogs.com/hss-521/p/7227608.html
Copyright © 2011-2022 走看看