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

原文地址:https://www.cnblogs.com/ruruozhenhao/p/8538702.html

时间: 2024-11-13 04:38:16

E - 稳定排序(结构体)的相关文章

HDU 1785 You Are All Excellent(斜率排序+结构体)

You Are All Excellent Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4651    Accepted Submission(s): 1558 Problem Description 本次集训队共有30多人参加,毫无疑问,你们都是很优秀的,但是由于参赛名额有限,只能选拔部分队员参加省赛.从学校的角度,总是希望选拔出

HDU 1236 排名 (排序+结构体)

#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> using namespace std; struct stu { char test[25]; int numm; int right[10]; int total; }student[1001]; int cmp(stu a,stu b) { if(a.total != b.total) retu

HDU 1084 [What Is Your Grade?] 结构体排序

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1084 题目大意:共5道题,N个学生.做出5道满分,0道50分.做出1-4道的同学,若在前50%(向下取整),则获得95.85.75.65,若在后50%则获得90.80.70.60. 关键思想:结构体排序 //结构体排序,考虑边界 #include <iostream> #include <algorithm> #include <cmath> #include <me

go语言的排序、结构体排序

原文:https://studygolang.com/articles/1598 晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题.排序 sort 是个基本的操作,当然搜索 search 也是.c 提供一个 qsort 和 bsearch,一个快排一个二分查找,不过是使用起来都不方便: c++ 中的 sort 貌似很不错,因为 c++ 支持泛型(或是说模板),所以很多东西使用起来很方便.go 是通过 sort 包提供排序和搜索,因为 go 暂时不支持泛型(将来也不好说支不支持),

Demo_张仕传_结构体考试-modify

/* 题目: //声明一个结构体类型 struct _AdvTeacher { char *name; char *tile; int age; char *addr; char *p1; //系统预留成员域 char **p2;//系统预留成员域 }; 要求定义一个结构体数组(6个元素),要求从键盘输入数据,并按照名称大小进行排序:打印输出. 1. 打印结构体数组,需要单独封装成函数:10 2. 排序结构体数组,需要单独封装成函数(按照名称进行排序):50 3. main函数中编写业务测试模型

结构体指针排序

输入不超过30名学生的信息,包括姓名,单科分数,出生年月,对其排序后输出. 运用知识点:结构体.指针.排序.函数. 1 #include<stdio.h> 2 #include<string.h> 3 4 struct birth 5 { 6 int y; 7 int m; 8 int d; 9 }; 10 struct student 11 { 12 int num; 13 char name[20]; 14 double score; 15 struct birth birth

【转】 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<algorithm>//貌似可以不用,但最好加上. using namespace std

C语言 &#183; 运用结构体的排序方法

之前遇到排序只想着最原始的方法,诸如冒泡,选择,快速排序等等,刚刚跟大牛学会了结构体的方法来排序,这样的话以后再也不用怕成绩统计.名次排序之类的题目了. 首先头文件(基于大牛的方法,本人之后做题喜欢引入题目中常用的五个头文件) #include<stdlib.h> #include<string.h> 定义结构体: /*定义一个结构体*/ typedef struct Stu{ char name[10]; int id; int score; }stu; 注释:最后一行stu是别

C++结构体排序

在C++中,对结构体的排序方式比C语言丰富的多.在C语言中,我们主要是通过qsort进行排序操作(抛开手写排序算法不说). 在C++<algorithm>中,有一个十分强大的排序函数sort,他的内部综合了许多种排序算法,因此非常高效.并且,用它来对结构体排序也十分方便. 先贴一段示例代码: 1 #include <cstdio> 2 #include <queue> 3 #include <vector> 4 #include <algorithm&