HJ68 成绩排序 ●●

描述

给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。

注:0代表从高到低,1代表从低到高

数据范围:人数: 1 ≤ n ≤ 200 1\le n \le 200 1≤n≤200

进阶:时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度: O ( n ) O(n) O(n)

输入描述:

第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

示例

输入:
3
0
fang 90
yang 50
ning 70
输出:
fang 90
ning 70
yang 50

题解

1. 归并排序

题目中要求排序是稳定的,因此不能使用堆排序或者快速排序。

在排序过程中,成绩相等时则先输出左边的元素;

而对于升序或降序的选择,函数中使用 异或^ 运算符进行处理。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度: O ( n ) O(n) O(n)

#include<iostream>
#include<string>
#include<vector>
using namespace std;
typedef vector<pair<string, int>> vec;void mergeSort(vec& list, vec& sorted, bool flag, int start, int end){if(start >= end) return;int mid = start + (end - start) / 2;mergeSort(list, sorted, flag, start, mid);mergeSort(list, sorted, flag, mid+1, end);int left = start, right = mid+1;int idx = start;while(idx <= end){if(left > mid){sorted[idx++] = list[right++];}else if(right > end){sorted[idx++] = list[left++];}else if(list[left].second == list[right].second){sorted[idx++] = list[left++];}else if(list[left].second > list[right].second ^ flag){  // 升序或降序选择sorted[idx++] = list[left++];}else{sorted[idx++] = list[right++];}}for(int i = start; i <= end; ++i){list[i] = sorted[i];}
}int main() {int n, flag;while(cin >> n >> flag){vec list(n, {"", 0});for(int i = 0; i < n; ++i){cin >> list[i].first >> list[i].second;}vec sorted(list);mergeSort(list, sorted, flag, 0, list.size()-1);  // 排序for(int i = 0; i < n; ++i){                          // 输出cout << list[i].first << " " << list[i].second << endl;}}
}

2. 稳定排序函数 stable_sort

和 sort() 函数一样,实现 stable_sort() 的函数模板也位于 algorithm 头文件中,但它是基于归并排序实现的稳定排序算法。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<string, int> t_pair;int main() {int n;bool flag;while(cin >> n >> flag){vector<pair<string, int>> list(n, {"", 0});for(int i = 0; i < n; ++i){cin >> list[i].first >> list[i].second;}if(flag == 1){                           // lambda 表达式stable_sort(list.begin(), list.end(), [](const t_pair& a, const t_pair& b){return a.second < b.second;});}else{stable_sort(list.begin(), list.end(), [](const t_pair& a, const t_pair& b){return a.second > b.second;});}for(int i = 0; i < n; ++i){cout << list[i].first << " " << list[i].second << endl;}}
}

HJ68 成绩排序 ●●相关推荐

  1. python【蓝桥杯vip练习题库】ADV-290成绩排序

    试题 算法提高 成绩排序 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出n个学生的成绩,将这些学生按成绩排序, 排序规则,优先考虑数学成绩,高的在前:数学相同,英语高的在前:数 ...

  2. 成绩排序的c语言算法,成绩排序系统(练习排序算法和复习C语言)

    成绩排序系统(练习排序算法和复习C语言) 实验一 一.实验目的 1.回顾C语言中的输入.输出及结构体等相关知识点: 2.回顾函数的使用: 3.掌握插入排序.交换排序.选择排序中的常用排序的算法思想: ...

  3. PTA学生成绩排序-C语言详解

    7-72 学生成绩排序 (20分) 给出一组学生名单(姓名和成绩),请输出按成绩从大到小排序后的结果(名次和姓名).成绩相同的人拥有相同的名次,且按姓名的字典序从小到大排列.题目保证学生姓名没有重复. ...

  4. java 学生成绩排序

    编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中. 程序运行效果如图: import java.awt.BorderLayout; i ...

  5. c语言用链表对学生成绩排序,学生成绩排序和平均分计算利用c语言链表的创建插入删除.doc...

    #define NULL 0 #define LEN sizeof(struct student) struct student { long num; float score; struct stu ...

  6. 1.10 编程基础之简单排序 03 成绩排序 3分 python

    http://noi.openjudge.cn/ch0110/03/ """ 1.10 编程基础之简单排序 03 成绩排序 3分 http://noi.openjudge ...

  7. 分别用Comparable和Comparator两个接口对下列四位同学的成绩做降序排序,如果成绩一样, 那在成绩排序的基础上按照年龄由小到大排序。 姓名(String

    代码 import java.util.*;/*3.分别用Comparable和Comparator两个接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序.姓名 ...

  8. 信息学奥赛一本通 1178:成绩排序 | OpenJudge NOI 1.10 03:成绩排序

    [题目链接] ybt 1178:成绩排序 OpenJudge NOI 1.10 03:成绩排序 [题目考点] 1. 结构体 排序 [君义精讲]排序算法 2. 多关键字排序 方法1:将多关键字的排序条件 ...

  9. 信息学奥赛一本通(1178:成绩排序)——选择排序

    1178:成绩排序 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 29458     通过数: 11916 [题目描述] 给出班里某门课程的成绩单,请你按成绩从高 ...

最新文章

  1. uboot环境变量-带分号的环境变量
  2. php负载均衡面板,nginx负载均衡的五种策略
  3. win8.1计算机开启远程桌面连接不上,启动Win8.1远程桌面不得不知的方案
  4. java 索引排序_Java培训MySQL之排序分组优化索引的选择
  5. 非刚性人脸跟踪 —— 人脸跟踪
  6. 网络共享服务Samba和NFS配置
  7. Java servlet项目里的web.xml
  8. MacOS 好用的插件和图形界面程序
  9. python-socket介绍
  10. SV processses
  11. go-import下划线的作用
  12. winform学习之-----页面设计-20160523
  13. 基于STC89C52的自动循迹小车项目
  14. 程序员老外通过编程赚钱的10个途径
  15. 用关键词搜索店铺列表详情
  16. VI退出 退出VIM 适用新手
  17. Mariadb互为主从(双主模式)配置
  18. 李永乐数学基础过关660题线性代数填空题
  19. 本机DNS服务器地址查询
  20. 用Java输出兔子图形,如何画出可爱的兔子?那你看看这个!

热门文章

  1. bzoj 3728 zarovik 买灯泡
  2. 京东打单发货如何识别疫情地区?
  3. 【经验分享】BMPR文件及其打开软件Balsamiq Wireframes的下载和安装
  4. 【Python】​​​​​​​turtle八边形绘制
  5. Redis 核心知识——01
  6. linux下安装了lxml但依然报错rom lxml import etreeModuleNotFoundError: No module named ‘lxml‘
  7. 优漫动游平面设计的形式美
  8. Typhon升级到5.8,编译原来程序出现提示:Compilation raised exception internally
  9. IntelliJ IDE
  10. 第三单元 用python学习微积分(二十二)功、平均值、概率(下)和 数值积分(1)