HJ68 成绩排序 ●●
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 成绩排序 ●●相关推荐
- python【蓝桥杯vip练习题库】ADV-290成绩排序
试题 算法提高 成绩排序 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出n个学生的成绩,将这些学生按成绩排序, 排序规则,优先考虑数学成绩,高的在前:数学相同,英语高的在前:数 ...
- 成绩排序的c语言算法,成绩排序系统(练习排序算法和复习C语言)
成绩排序系统(练习排序算法和复习C语言) 实验一 一.实验目的 1.回顾C语言中的输入.输出及结构体等相关知识点: 2.回顾函数的使用: 3.掌握插入排序.交换排序.选择排序中的常用排序的算法思想: ...
- PTA学生成绩排序-C语言详解
7-72 学生成绩排序 (20分) 给出一组学生名单(姓名和成绩),请输出按成绩从大到小排序后的结果(名次和姓名).成绩相同的人拥有相同的名次,且按姓名的字典序从小到大排列.题目保证学生姓名没有重复. ...
- java 学生成绩排序
编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中. 程序运行效果如图: import java.awt.BorderLayout; i ...
- c语言用链表对学生成绩排序,学生成绩排序和平均分计算利用c语言链表的创建插入删除.doc...
#define NULL 0 #define LEN sizeof(struct student) struct student { long num; float score; struct stu ...
- 1.10 编程基础之简单排序 03 成绩排序 3分 python
http://noi.openjudge.cn/ch0110/03/ """ 1.10 编程基础之简单排序 03 成绩排序 3分 http://noi.openjudge ...
- 分别用Comparable和Comparator两个接口对下列四位同学的成绩做降序排序,如果成绩一样, 那在成绩排序的基础上按照年龄由小到大排序。 姓名(String
代码 import java.util.*;/*3.分别用Comparable和Comparator两个接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序.姓名 ...
- 信息学奥赛一本通 1178:成绩排序 | OpenJudge NOI 1.10 03:成绩排序
[题目链接] ybt 1178:成绩排序 OpenJudge NOI 1.10 03:成绩排序 [题目考点] 1. 结构体 排序 [君义精讲]排序算法 2. 多关键字排序 方法1:将多关键字的排序条件 ...
- 信息学奥赛一本通(1178:成绩排序)——选择排序
1178:成绩排序 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 29458 通过数: 11916 [题目描述] 给出班里某门课程的成绩单,请你按成绩从高 ...
最新文章
- uboot环境变量-带分号的环境变量
- php负载均衡面板,nginx负载均衡的五种策略
- win8.1计算机开启远程桌面连接不上,启动Win8.1远程桌面不得不知的方案
- java 索引排序_Java培训MySQL之排序分组优化索引的选择
- 非刚性人脸跟踪 —— 人脸跟踪
- 网络共享服务Samba和NFS配置
- Java servlet项目里的web.xml
- MacOS 好用的插件和图形界面程序
- python-socket介绍
- SV processses
- go-import下划线的作用
- winform学习之-----页面设计-20160523
- 基于STC89C52的自动循迹小车项目
- 程序员老外通过编程赚钱的10个途径
- 用关键词搜索店铺列表详情
- VI退出 退出VIM 适用新手
- Mariadb互为主从(双主模式)配置
- 李永乐数学基础过关660题线性代数填空题
- 本机DNS服务器地址查询
- 用Java输出兔子图形,如何画出可爱的兔子?那你看看这个!
热门文章
- bzoj 3728 zarovik 买灯泡
- 京东打单发货如何识别疫情地区?
- 【经验分享】BMPR文件及其打开软件Balsamiq Wireframes的下载和安装
- 【Python】​​​​​​​turtle八边形绘制
- Redis 核心知识——01
- linux下安装了lxml但依然报错rom lxml import etreeModuleNotFoundError: No module named ‘lxml‘
- 优漫动游平面设计的形式美
- Typhon升级到5.8,编译原来程序出现提示:Compilation raised exception internally
- IntelliJ IDE
- 第三单元 用python学习微积分(二十二)功、平均值、概率(下)和 数值积分(1)