C++知识点总结(16):结构体排序

课程大纲

  • 一、常见排序方法
    • 1. 桶排序
    • 2. 冒泡排序
    • 3. 选择排序
    • 4. 插入排序
  • 二、结构体排序
    • 1. 融入实际
    • 2. 认识结构体
      • 2.1 概念
      • 2.2 框架
        • 2.2.1 存储
        • 2.2.2 输入输出
        • 2.2.3 结构体数组
        • 2.2.4 例题
          • 2.2.4.1 结构体读写
          • 2.2.4.2 结构体交换
  • 三、sort函数
    • 1. 使用方法
    • 2. 固定格式
  • 四、结构体和sort函数
    • 1. 成绩排名
    • 2. NOIP 09年真题 洛谷P1068

一、常见排序方法


我们以下面的序列为例,看一看桶排序、冒泡排序、选择排序、插入排序的排序过程。
< 5 , 2 , 7 , 1 , 4 > <5, 2, 7, 1, 4> <5,2,7,1,4>


1. 桶排序

借助 cnt[] 数组的下标进行存储,适用于正整数和集中数字的排序。

下标元素
11
22
3
44
55
6
77
8
9

2. 冒泡排序

两两元素比较,每一轮找出最大数字冒到最后一个位置。

轮数排序结果
15 2 1 4 7
22 1 4 5 7
31 2 4 5 7

3. 选择排序

找最小值和区间的第一个元素交换。

轮数排序结果
12 1 4 5 7
21 2 7 5 4
31 2 4 7 5
41 2 4 5 7

4. 插入排序

重复插入元素(扑克牌)。

轮数排序结果
12 5 7 1 4
22 5 7 1 4
32 5 7 1 4
41 2 5 7 4
51 2 4 5 7

二、结构体排序

1. 融入实际

姓名金牌银牌铜牌总数
ml65819
lr561021
xc55414
hs55313
zl36716

如果按照原来的思想,需要进行 5 5 5 个数组,更占空间。

2. 认识结构体

2.1 概念

用户自定义一个数据类型,可以包含很多基础数据类型。

2.2 框架

2.2.1 存储
struct Node // 结构体类型名后不带()
{char name[105]; // string类型最好用char[]数组,string可能导致不稳定int gold; // 数据类型 + 名称int silver;int copper;int sum;
}score; // 一定记得加分号
Node score = {"ml", 6, 5, 8, 19}; // 存储数据
2.2.2 输入输出
cin >> score.name >> score.gold >> ...;
cout << score.gold; // 输出金牌数
2.2.3 结构体数组
Node nodes[105];

这样可以让一组数据实现交换。

swap(nodes[1], nodes[3]);

或者一个数据。

swap(nodes[1].gold, nodes[3].gold);
2.2.4 例题
2.2.4.1 结构体读写

要求:第一行输入n,接下来n行输入一个名字+一个年龄,要求输出对应名字和对应的

#include <iostream>
using namespace std;int n;
struct Node
{char name[55];int age;
}people;int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> people.name >> people.age;cout << people.name << "年龄为" << people.age << endl;}return 0;
}

运行结果:

[IN]
2
Andy 15
Anne 14[OUT]
Andy年龄为15
Anne年龄为14
2.2.4.2 结构体交换

要求:第一行输入n表示人数,k和m表示对应需要交换的数组下标。

#include <iostream>
using namespace std;int n, k, m;
struct Node
{char chn[1005];char eng[1005];int grade;double high;
}stu[1005];int main()
{cin >> n >> k >> m;for (int i = 1; i <= n; i++){cin >> stu[i].chn >> stu[i].eng >> stu[i].grade >> stu[i].high;}swap(stu[k], stu[m]);for (int i = 1; i <= n; i++){cout << stu[i].chn << " " << stu[i].eng << " " << stu[i].grade << " " << stu[i].high << endl;}return 0;
}

三、sort函数

1. 使用方法

#include <iostream>
#include <algorithm> // 必须导入算法头文件
using namespace std;int main()
{int a[10] = {10, 9, 8, 3, 4, 5, 7, 2, 6, 1};sort(a+2, a+8);for (int i = 0; i <= 9; i++){cout << a[i] << " ";}return 0;
}

sort() 函数中,第一个参数 + 的是多少就是起始排序的下标;第二个参数 + 的是多少就是种植排序的下标 − 1 -1 1sort() 默认会进行升序排序,要使用降序排序,则应该使用:

// 方法1: 运用某些朝纲的东西
sort(a, a+5, greater<int>());// 方法2: 自己定义比较规则
bool cmp(int a, int b)
{return a > b; // 降序// return a < b; 升序
}
sort(a, a+5, cmp);

2. 固定格式

使用前需要添加头文件:

#include <algorithm>

使用格式:

sort(数组 + 起始下标, 数组 + 终止下标 + 1)

四、结构体和sort函数

1. 成绩排名

题目描述
综合测评结束啦,现在语文数学成绩都出来了。我们再来排个序,排序规则如下:
语文成绩高的排在前面;
如果语文成绩一样,数学成绩高的排前面;
如果语文成绩和数学成绩都一样,按学号从小到大排序。
请你写代码输出一下排序结果吧
输入描述

输入有 n + 1 行,第一行是一个整数 n (0 < n < 30),为学生总人数;
接下来的 n 行中,每一行有三个整数,分别为学号 id(0 < id < 100),语文成绩 ch (0 < ch <= 100),数学成绩 ma(0 < ma <= 100),每个人的学号一定不同

输出描述

输出有 n 行,每行有学号、语文成绩和数学成绩,用空格隔开,按题目要求排序

样例1
输入

2
18 90 95
12 90 95

输出

12 90 95
18 90 95

样例2
输入

3
10 90 95
24 99 60
34 90 97

输出

24 99 60
34 90 97
10 90 95

【参考程序】

#include <iostream>
#include <algorithm>
using namespace std;int n;struct Node
{int id, chn, mth;
}stu[35];bool cmp(Node a, Node b)
{if (a.chn != b.chn){return a.chn > b.chn;}else if (a.mth != b.mth){return a.mth > b.mth;}else{return a.id < b.id;}
}int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> stu[i].id >> stu[i].chn >> stu[i].mth;}sort(stu+1, stu+n+1, cmp);for (int i = 1; i <= n; i++){cout << stu[i].id << " " << stu[i].chn << " " << stu[i].mth << endl;}return 0;
}

我们在书写 cmp() 函数的时候,传入的参数可能是 int 类型或者我们自定义的 Node 类型。int 类型可以调换一维数组的元素,Node 类型可以调换二维数组的一维数组。

2. NOIP 09年真题 洛谷P1068

问题描述

世博会志愿者的选拔工作正在A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

输入格式

第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证m*150%向下取整后小于等于n。第二行到第n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。数据保证选手的报名号各不相同。

输出格式

第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

样例1
输入

6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88

输出

88 5
1005 95
2390 95
1000 90
1001 88
3239 88

提示
样例说明: m ∗ 150 % = 3 ∗ 150 % = 4.5 m*150% = 3*150% =4.5 m150=3150=4.5 ,向下取整后为 4 4 4 。保证 4 4 4 个人进入面试的分数线为 88 88 88 ,但因为 88 88 88 有重分,所以所有成绩大于等于 88 88 88 的选手都可以进入面试,故最终有 5 5 5 个人进入面试。
【参考代码】

#include <iostream>
#include <algorithm>
using namespace std;int n, m, line, people;struct Node
{int id, s; 
}ps[5005];bool cmp(Node a, Node b)
{if (a.s != b.s){return a.s > b.s;}return a.id < b.id;
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i++){cin >> ps[i].id >> ps[i].s;}sort(ps+1, ps+n+1, cmp);people = (int)(m * 1.5);line = ps[people].s;while (ps[people+1].s == line){people++;}cout << line << " " << people << endl;for (int i = 1; i <= people; i++){cout << ps[i].id << " " << ps[i].s << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rofin罗芬Laser激光DQ80设备操作说明书

Rofin罗芬Laser激光DQ80设备操作说明书

计算机视觉的应用23-OpenAI发布的文本生成视频大模型Sora的原理解密

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用23-OpenAI发布的文本生成视频大模型Sora的原理解密。本文概况性地将Sora模型生成视频主要分为三个步骤&#xff1a;视频压缩网络、空间时间潜在补丁提取以及视频生成的Transformer模型。 文章目录…

【lesson62】网络通信UdpSocket版

文章目录 UdpSocketUdpServer.hppUdpServer类成员变量解释成员函数解释 UdpServer的实现ServerIinit的实现socketbindhtonsinet_addr具体实现 ServerStart的实现recvfromsendtontohsinet_ntoa具体实现 ~UdpServer函数实现UdpServer.hpp整体完整代码 UdpServer.ccUdpClient.ccTh…

CDP和Chrome

CDP和Chrome CDP和WebDriver Protocol WebDriver和 Chrome DevTools Protocol&#xff08;CDP&#xff09; 是用于自动化浏览器的两个主要协议&#xff0c;大多数的浏览器自动化工具都是基于上述其中之一来实现的。可以通过这两种形式来和浏览器交互&#xff0c;通过代码来控…

拉链表的概念设计与实现

拉链表 一、概念 拉链表是针对数据仓库设计中表存储数据的方式而定义的&#xff0c;所谓拉链&#xff0c;就是记录历史。记录一个事物从开始&#xff0c;一直到当前状态的所有变化的信息。 用处&#xff1a; 解决持续增长且存在一定时间时间范围内重复的数据 场景&#xff1…

ElementUI +++ Echarts面试题答案汇总

官网地址&#xff1a;http://element-cn.eleme.io/#/zh-CN ElementUI是一套基于VUE2.0的桌面端组件库&#xff0c;ElementUI提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。 ElementUi是怎么做表单验证的&#xff1f;在循环里对每个input验证怎么做呢&#x…

探索海洋世界,基于DETR(DEtection TRansformer)模型开发构建海洋场景下海洋生物检测识别分析系统

前面的博文中&#xff0c;开发实践过海底相关生物检测识别的项目&#xff0c;对于海洋场景下的海洋生物检测则很少有所涉及&#xff0c;这里本文的主要目的就是想要开发构建基于DETR的海洋场景下的海洋生物检测识别系统。 首先看下实例效果&#xff1a; DETR (DEtection TRans…

【机器学习笔记】 15 机器学习项目流程

机器学习的一般步骤 数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序&#xff0c;包括检查数据一致性&#xff0c;处理无效值和缺失值等。与问卷审核不同&#xff0c;录入后的数据清理一般是由计算机而不是人工完成。 探索性数据分析(EDA 探索性数据…

Elasticsearch查询报错 Result window is too large

一现象&#xff1a; es数据分页查询前端提示系统异常&#xff0c;后端报错日志 二根本原因&#xff1a; 默认情况下&#xff0c;Elasticsearch 限制了 from size 参数的组合不能超过 10,000 条记录&#xff0c;用于防止查询大数据集时对系统资源的过度消耗 三解决办法&#…

沁恒CH32V30X学习笔记09---使用TIM 外部时钟1模式实现硬件计数

TIM 外部时钟1使用 定时器时钟 通过框图可知;外部时钟1模式下仅仅只有通道1 和通道2 可以输入脉冲 简单示例教程 void TIM1_ETRClockMode1_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);TIM_CounterModeConfig(TIM1, TIM_CounterMode_Up)

机器学习---强化学习

1. 什么是强化学习 在连接主义学习中&#xff0c;在学习的方式有三种&#xff1a;非监督学习(unsupervised learning)、监督学习 (supervised leaning)和强化学习。监督学习也称为有导师的学习&#xff0c;需要外界存在一个“教师”对给定 输入提供应有的输出结果&#xff0…

Android 11.0 mtp在锁屏模式和息屏时禁止访问mtp文件夹功能实现

1.前言 在11.0的系统rom产品定制化开发中,由于系统对于mtp模式访问文件夹没有限制,就是在锁屏息屏状态下也是可以访问文件夹的,由于产品的需要 要求在锁屏和息屏的情况下,禁止访问文件夹,就是需要实现如图效果 2.mtp在锁屏模式和息屏时禁止访问mtp文件夹功能实现的核心…

前端自动生成二维码并长按识别跳转 Vue

下载arale-qrcode依赖&#xff1a; npm i arale-qrcode --save引用依赖&#xff1a; import AraleQRCode from "arale-qrcode";代码部分&#xff1a; <template><div class"container">// 生成二维码按钮<van-button click"getErwe…

【Vue3】路由传参的几种方式

路由导航有两种方式&#xff0c;分别是&#xff1a;声明式导航 和 编程式导航 参数分为query参数和params参数两种 声明式导航 query参数 一、路径字符串拼接(不推荐) 1.传参 在路由路径后直接拼接?参数名:参数值 &#xff0c;多组参数间使用&分隔。 <RouterLink …

unity学习(27)——修改text控件的内容

手游最大的特点就是简单易懂好上手。 1.在canvas上添加一个text的UI&#xff0c;内容设置为空。在字体处添加宋体&#xff0c;增加一个tag。 2.修改LoginHandler中的内容如下&#xff1a;&#xff08;之前有从inputFiled中获取文字的经验&#xff09; public void LoginHandl…

阿里云幻兽帕鲁服务器,游戏服务端版本升级怎么操作?

用阿里云一键部署的幻兽帕鲁服务器&#xff0c;想要更新游戏服务端版本&#xff0c;现在非常简单。之前还需要通过输入一行命令来更新&#xff0c;而现在可以直接通过面板上的选型来操作。 打开阿里云的计算巢&#xff0c;找到你的这台服务实例&#xff0c;点击进入&#xff0…

Python语法和javascript有哪些异同?

Python和JavaScript是两种流行的编程语言&#xff0c;它们在语法和用途上有一些异同。 1、语法异同&#xff1a; 变量声明&#xff1a;Python不需要显式声明变量的类型&#xff0c;而JavaScript则使用 var, let 或 const 关键字声明变量。 语句结束符&#xff1a;Python使用换…

通过HTTP隧道在Linux上实现跨域资源共享(CORS):打破数字世界的“门禁”

在数字世界里&#xff0c;有时你会碰到一些“门禁”&#xff0c;它们阻止你访问某些资源&#xff0c;就像现实生活中的门禁系统一样。这些“门禁”就是所谓的跨域资源共享&#xff08;CORS&#xff09;限制。不过别担心&#xff0c;我们有一个绝妙的解决方案&#xff1a;通过HT…

模板(函数模板)---C++

模板目录 模板1.模板概念&#xff12;.泛型编程 1.函数模板1.1 函数模板语法1.2 函数模板注意事项1.3 普通函数与函数模板的区别1.4 普通函数与函数模板的调用规则1.5 模板的局限性1.6 函数模板案例 模板 1.模板概念 模板就是建立通用的模具&#xff0c;大大提高复用性。 模板…

安防监控平台EasyCVR升级之后添加通道进行播放,提示“请确认播放协议配置选项”是什么原因?

智慧安防平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台可支持的接入协议包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&a…