C++/C sort函数用法(详细),cmp的构造--一学就会,一用就对

2023-05-16

sort函数

sort是c++STL标准库中提到的基于快速排序的排序函数,在做题的时候使用sort函数很方便,使用sort要使用#include

快速排序具有不稳定性

 不稳定性是指,对于指定区域内相等的元素,sort函数可能无法保证数据的元素不发生相对位置不发生改变。
 这对于普通的排序问题可能没有影响,比如对于
  2 2 3 1 5
  排序后
 1 2 2 3 1 5 (排序前第一个二可能在这里是第二个2)
 但是在这里,这些2么有其他含义,对题解影响不大
 !!!但是要注意
 假如上述两个2风别代表月份和日
 那这里可能就会产生歧义

c++中其他有关排序的函数

	sort (first, last,cmp)// 	对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序。
	stable_sort (first, last) //	和 sort() 函数功能相似,不同之处在于,对于 [first, last) 范围内值相同的元素,该函数不会改变它们的相对位置。
	partial_sort (first, middle, last)// 	从 [first,last) 范围内,筛选出 muddle-first 个最小的元素并排序存放在 [first,middle) 区间中。
	partial_sort_copy (first, last, result_first, result_last)// 	从 [first, last) 范围内筛选出 result_last-result_first 个元素排序并存储到 [result_first, result_last) 指定的范围中。
	is_sorted (first, last)// 	检测 [first, last) 范围内是否已经排好序,默认检测是否按升序排序。
	is_sorted_until (first, last)// 	和 is_sorted() 函数功能类似,唯一的区别在于,如果 [first, last) 范围的元素没有排好序,则该函数会返回一个指向首个不遵循排序规则的元素的迭代器。
	void nth_element (first, nth, last)// 	找到 [first, last) 范围内按照排序规则(默认按照升序排序)应该位于第 nth 个位置处的元素,并将其放置到此位置。同时使该位置左侧的所有元素都比其存放的元素小,该位置右侧的所有元素都比其存放的元素大。

sort可以排序的对象:

	数组(sort函数的cmp不是必须的,不写默认升序排序)
	结构体

什么样的元素可以接受sort函数排序

元素类型接受使用>或<运算符
只能对vector,array,deque这三个容器进行排序	

cmp函数的使用

sort函数在不使用 cmp函数下,默认使用升序排序的cmp函数
升序:

#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp1(int i,int j)
{
	return i>j;//i>j返回值是bool类型,true/flase,可以用1/0来代替,假如t1表示x,y不需要互换,假如是0则需要互换.所以这里也可以这样写
/*if(i>j)
		return 1;//前面的数大,不换
	else if(i<=j)//换
		return 0;
*/
}
int main()
{
	int a[100]={1, 51 , 65 , 1 , 8 , 9 , 8 , 52 , 89 , 21 };
	sort(a,a+100,cmp1);
	for(int i=0;i<100;i++)
		printf("%d ",a[i]);
}

降序:

同理:
bool cmp2(int i,int j)
{
	return i<j;
	/*if (i>j)
		return 0;
	else if(i<=j)
		return 1;*/
}

对n个元素的a数组:sort(a,a+n,cmp)

对结构体进行排序

对结构体排序要构造cmp函数

#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
struct student{
	int id;
	int score;
}p[10];
bool cmp3(struct student i,struct student j)
{
	return i.score>j.score;
}
int main()
{
	for(int i=0;i<10;i++)
		scanf("%d %d",&p[i].id,&p[i].score);
	sort(p,p+10,cmp3);
	for(int i=0;i<10;i++)
		printf("id:%d score%d\n",p[i].id,p[i].score);
	return 0;
}

结构体数组使用sort排序和数组排序很相似
对于cmp:使用
bool (struct 结构体 结构体变量名,struct 结构体 结构体变量名)
{
return 结构体1.待排序变量>或<结构体2.待排序变量
}

!!很多题目不会让你对于结构体内的某个变量进行单调排序,很可能会有其他限制条件,可能对于年龄排序来说,还要排学号等等

下面用洛谷P1104题目进行示范
cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序。但cjf君最近作业很多,没有时间,所以请你帮她排序。
输入:人数
姓名 年 月 日
例:
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
输出:
Luowen
Yangchu
Qiujingya

分析:需要对年月日排序,先排年,年同再排月,月相同再排日:

#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
struct struct{
	int id;
	char s[20];
	int y;
	int m;
	int d;
}p[100];
bool cmp(mate a,mate b)
{
	if(a.y<b.y)return 1;//先比年,前面小于后面就不换,因为前面老
	if(a.y>b.y)return 0;//前面年数大,换
	if(a.y==b.y)
	{
		if(a.m<b.m)return 1;//再比月
		if(a.m>b.m)return 0;
		if(a.m==b.m)
		{
			if(a.d<b.d)return 1;//再比日
			if(a.d>b.d)return 0;
			if(a.d==b.d)
			{
				if(a.id>b.id)return 1;//最后比编号
				else return 0;
			}
		}
	}
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%s %d %d %d",&p[i].s,&p[i].y,&p[i].m,&p[i].d);
		p[i].id=i;
	}
	sort(p,p+n,cmp);
	for(int i=0;i<n;i++)
	{
		if(i<n-1)
			printf("%s\n",p[i].s);
		else
			printf("%s",p[i].s);
	}
	return 0;
}

分析:简而言之,谁老谁在先,就是排年,年数小就老,年同然后接着比月,月同再比日

对于上文提及的快速排序的不稳定性,可以使用stable_sort函数,不会改变相等元素的位置

题目:洛谷P5740

现有 N(N≤1000) 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8 个字符的字符串,没有空格)、语文、数学、英语成绩(均为不超过 150 的自然数)。总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。
eg:输入 3
senpai 114 51 4
lxl 114 10 23
fafa 51 42 60
输出
senpai 114 51 4

此题用结构体很方便,在获取分数的时候把总分存入结构体内,然后对结构体排序,输出第一个,这里最好使用stable_sort,因为可能存在同分数的情况,此时要输入靠前的,这里用stable_sort很方便
迟到的代码

#include<stdio.h>
#include<algorithm>
using namespace std;
struct stu{
	char a[10];
	int chinese;
	int math;
	int english;
	int score;
}p[1005];
bool cmp(struct stu x,struct stu y)
{
	return x.score>y.score;
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%s %d %d %d",p[i].a,&p[i].chinese,&p[i].english,&p[i].math);
		p[i].score=p[i].chinese+p[i].english+p[i].math;
	}
	stable_sort(p,p+1005,cmp);
	printf("%s %d %d %d",p[0].a,p[0].chinese,p[0].english,p[0].math);
	
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++/C sort函数用法(详细),cmp的构造--一学就会,一用就对 的相关文章

  • MyBatis实现分页查询

    目录 一 基于注解的简单分页查询 1 定义对象 2 Mapper接口 3 Controller类 4 功能实现 二 基于注解的较复杂分页查询 1 定义shop实体类和page分页类 2 Mapper接口 3 Controller类 4 功能
  • python 读取word表格中的表格

    解决方案 xff1a 在网上没有找到可行的嵌套表格内容读取方法 查看python docx包源代码找到以下两种解决方案 xff1a 方案一 xff1a 按行列读到单元格后再取tables xff0c 此处table cell tables值
  • sublime配置C/C++并调试

    文章目录 前言1 工具准备1 1 sublime的安装1 2 MinGw的安装和配置 2 开始配置2 1 MinGw路径放进环境变量2 2 sublime的配置 3 开始使用3 1 运行代码3 2 调试代码 前言 本文主要讲关于sublim
  • 洛谷P1025 [NOIP2001 提高组] 数的划分(DP)

    题目描述 将整数 n n n 分成 k k k 份 xff0c 且每份不能为空 xff0c 任意两个方案不相同 xff08 不考虑顺序 xff09 例如 xff1a
  • 【Rust深入浅出-5】拓展数据类型

    Rust深入浅出 5 拓展数据类型 第一章Hello World 第二章 变量和基本数据类型 第三章 运算符 第四章 类型转换 第五章 拓展数据类型 文章目录 Rust深入浅出 5 拓展数据类型前言slice切片tuple元组索引match
  • sort 函数排序之cmp浅析

    1 一般来说 xff0c sort可对整型和浮点型数据进行排序 xff0c 排序从小到大 xff0c 如果需要变为从大到小 xff0c 那么我们可以定义一个cmp函数 xff0c 定义如下 xff1a bool cmp int x int
  • 魔导师晨拥

    链接 xff1a 登录 专业IT笔试面试备考平台 牛客网 来源 xff1a 牛客网 魔导师晨拥是 炉石传说 中的一张传说卡牌 魔导师晨拥的英雄技能为初始造成 222 点伤害 xff0c 如果恰好消灭某个随从 xff0c 则伤害永久增加 11
  • Royal TSX常见问题:解决远程桌面(RDP)连接错误

    Royal TSX mac破解版是一款帮助用户管理桌面的Mac桌面管理软件 xff0c Royal TSX for mac为你提供方便安全的访问远程系统 Royal TSX专为服务器管理员 系统工程师 开发人员和IT信息工作者开发设计 xf
  • 解决jupyter notebook :No module named ‘tensorflow‘ 及python.exe无法找到入口问题及500 : Internal Server Error

    目录 jupyter notebook ModuleNotFoundError No module named 39 tensorflow 39 问题 可能性1 xff1a tensorflow版本与python版本不匹配 可能性2 xff
  • Ceph安装步骤1——基础Ceph集群安装

    一 基础环境 本文所搭建环境为Centos 7 内核4 17版本 xff0c 安装Ceph版本为luminous 一共配置三台机器 xff0c 每台机器的IP地址和主机名称分别为 xff1a 192 168 1 131 ceph admin
  • 远程桌面--某些设置由你的组织管理

    解决某些设置由你的组织管理 在cmd的运行里输入 gpedit msc 选择 计算机配置 gt 选择 管理模块 gt 选择 Windows组件 gt 选择 远程桌面服务 gt 选择 远程 桌面会话主机 gt 选择 连接 gt 右击 允许用户
  • 数据结构--第三章--栈和队列--知识点回顾

    第三章 栈和队列 一 基本知识点 1 栈 队列和线性表的异同 2 顺序栈的基本运算算法设计 3 链栈的基本运算算法设计 4 顺序队的基本运算算法设计 5 环形队列和非环形队列的特点 6 链队的基本运算算法设计 7 利用栈 队列求解复杂的应用
  • 实验四 SQL连接查询

    一 实验目的 xff1a 掌握SQL连接查询语句 二 实验内容和主要步骤 xff1a 查询每个学生及其选修成绩的情况 select sno cno Grade from sc 分别用左外连接和右外连接实现查询所有学生信息及其选修成绩的情况
  • wsl+opencv——清除旧版并安装新版,实测有效

    写在前面 我用的是cmake方式编译安装的opencv xff0c 但一直弄不好contrib这个东西 xff0c 索性先不用老版本的opencv我把源文件都删掉了 xff0c 没法用网上的一些方法make uninstall 卸载清除旧版
  • JAVA编程——父子类

    编程需求 需求如下 xff1a 编写父类People xff0c 子类Student继承自People类 父类People具有姓名 xff0c 性别 xff0c 年龄等性质 xff0c 还具有吃和说的行为 子类Student继承父类Peop
  • 部署zabbix6.2

    zabbix6 2安装步骤 配置阿里云源 注意本机的操作系统的centos8 span class token punctuation span root 64 localhost span class token operator spa
  • zabbix功能介绍

    1 zabbix介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 zabbix能监视各种网络参数 xff0c 保证服务器系统的安全运营 xff1b 并提供灵活的通知机制以让系统管理员快速定位
  • haproxy部署安装

    haproxy简介 HAProxy是一个使用C语言编写的自由及开放源代码软件 xff0c 其提供高可用性 负载均衡 xff0c 以及基于TCP和HTTP的应用程序代理 HAProxy特别适用于那些负载特大的web站点 xff0c 这些站点通
  • KVM虚拟化介绍和安装使用方法

    一 KVM虚拟化介绍 虚拟化 xff1a 在一台计算机上虚拟出多个逻辑的计算机 xff0c 而且每个逻辑计算机 它可以是不同操作系统 虚拟化技术 xff1a 可以扩大硬件容量 xff0c 单个cpu模拟出多个cpu并行 xff0c 允许一个
  • nginx反向代理与负载均衡以及高可用

    nginx反向代理介绍 nginx通常被用作后端服务器的反向代理 xff0c 这样就可以很方便的实现动静分离以及负载均衡 xff0c 从而大大提高服务器的处理能力 nginx实现动静分离 xff0c 其实就是在反向代理的时候 xff0c 如

随机推荐

  • Ceph 配置URL访问s3 Bucket

    一 创建json文件 xff0c 用于编辑policy xff0c 文件内容如下 xff08 Version并不重要 xff09 xff0c Action存在多种选择 如步骤三所示 xff0c 并且允许同时选择多个 xff0c 本文只是通过
  • nginx做负载均衡服务器,配置动静分离

    nginx做负载均衡服务器 xff0c 配置动静分离 1 题目要求 xff1a 后端RS服务器 台部署LNMP nginx1 22 43 mysql8 0 43 php8 1 xff0c 台部署 httpd 要求nginx和php使 编译安
  • 常用自动化运维工具简介和Ansible安装

    自动化运维工具 Puppet Puppet是历史悠久的运维 具之 它是 种基础架构即代码 xff08 IaC xff09 具 xff0c 使 户可以定 义其 基础架构所需的状态 xff0c 并使系统 动化以实现相同状态 Puppet可监视
  • Python之变量、数据类型、类型转换、运算符

    Python学习笔记2022 1 10 pycharmSettingsFont 设置字体字形 大小 行距Keymap 设置快捷键project 变量 xff0c 容器 格式 xff1a 变量名 61 值变量名命名规范 xff1a 数据类型i
  • 强连通分量分解详解 超级详细

    xff08 写的有点小多 xff0c 慢慢看 xff0c 会有收获的 xff09 xff08 1 xff09 首先我们得了解 xff0c 什么是强连通 xff1f 如果在一个有向图顶点子集内 xff0c 任取两个点 u 和 v xff0c
  • c语言中%d %%d %%%d和\\%d的区别

    1 d xff0c 表示按整型输出后面给出的变量的值 2 d xff0c 这就会被拆成两部分看待 xff0c 一是 在C语言中就是输出一个 xff0c 而是 d 就是一个普通字符 xff0c 所以当 d 在一起时 xff0c 其含义就是输出
  • 无法找到模块“vue-json-viewer””的声明文件。

    报错信息 xff1a 无法找到模块 vue json viewer 的声明文件 Users pins Desktop 运营平台 joinpins infomation sysytem node modules vue json viewer
  • VIM-配置-.vimrc

    前言 在使用vim的时候我们可以输入 xff1a set nu 显示行号 xff0c 但每次都输一遍操作就显得冗余 将这段命令写入vimrc就可以避免重复操作 在linux环境下 xff0c 配置文件一般都叫 rc xff0c rc是 ru
  • mysql中关联json字段查询,将json存储的数组转换成一张临时表

    mysql中的json字段中存了一个数组 要将这个数组中符合条件的数据取出来 xff0c 数据库结构如下 xff1a CREATE TABLE 96 school 96 96 id 96 bigint NOT NULL AUTO INCRE
  • 树莓派入坑笔记

    一 安装树莓派官方操作系统Raspbian stretch步骤 xff1a 准备好SD卡 xff08 大小一般16GB及以上 xff09 准备SD卡的读卡器 准备树莓派的镜像 xff1a 链接 xff1a https pan baidu c
  • yolov5知识笔记

    1 在yolov的同等目录下创建一个自己的数据集文件夹 xff0c 存放自己的数据集 xff08 dataset xff09 xff1b 2 在dataset数据文件夹里 xff08 coco128 xff09 创建 train2017 存
  • Ceph安装步骤2——ceph存储池

    Ceph安装步骤1完成之后 xff0c 即可进行该步骤的操作 本文中以对sas池进行操作为例 一 创建Ceph Pool 1 计算每个池所需要的PG数目 在创建池之前 xff0c 首先需要计算PG数目 xff08 简单来说 xff0c PG
  • scrapy安装笔记并使用

    1 安装方法 xff1a Linux Mac xff1a pip install scrapy windows 简单使用直接pip install scrapy即可 1 pip install wheel 用于安装twisted 2 下载t
  • rosbag库的安装

    Output 1 python3 m pip install bagpy 2 python3 m pip install roslz4 extra index url https rospypi github io simple 1 安装a
  • 下载安装dingding

    百度搜索钉钉官网 xff1a https page dingtalk com wow z dingtalk simple ddhomedownlaod 下载安装包 xff1a com alibabainc dingtalk 1 4 0 20
  • su认证失败

    sudo passwd
  • 2021.12.30遇到的错误:No module named ‘paddle‘

    实际上已经安装了paddlepaddle xff0c 但不知为何又报这个错误 根据提示可知原因为未安装paddle 于是又去安装百度飞桨官网安装paddle 安装命令为 python span class token operator sp
  • 计组第六课

    汇编语言的组成 1 汇编指令 xff1a 机器码的助记符 xff0c 有对应机器码 2 伪指令 xff1a 无对应机器码 xff0c 由编译器执行 xff0c 没有对应机器码 3 其他符号 xff1a 如 43 等 xff0c 由编译器识别
  • GitLab秘钥添加

    前提 xff1a 下载Git Bash软件 xff0c 并拥有GitLab账号 1 选择用户主目录 xff08 C 用户 用户名 xff09 下 xff0c 新建一个文件夹 直接修改其文件名为 ssh会提示 必须输入文件名 xff0c 修改
  • C++/C sort函数用法(详细),cmp的构造--一学就会,一用就对

    sort函数 sort是c 43 43 STL标准库中提到的基于快速排序的排序函数 xff0c 在做题的时候使用sort函数很方便 xff0c 使用sort要使用 include 快速排序具有不稳定性 不稳定性是指 xff0c 对于指定区域