排序算法介绍和sort函数应用(明明的随机数,奖学金)

news2024/11/26 20:45:01

排序算法介绍sort函数应用——[NOIP2006 普及组] 明明的随机数和[NOIP2007 普及组] 奖学金

  • 1.排序算法介绍和常用排序方法复杂度
  • 2.sort函数应用
    • 2.1.[NOIP2006 普及组] 明明的随机数
      • 题目描述
      • 输入格式
      • 输出格式
      • 输入输出样例
        • 输入 #1
        • 输出 #1
      • 提示
      • 2.1.1.题意解析
      • 2.1.2.AC代码
    • 2.2.[NOIP2007 普及组] 奖学金
      • 题目背景
      • 题目描述
      • 输入格式
      • 输出格式
      • 输入输出样例
        • 输入 #1
        • 输出 #1
        • 输入 #2
        • 输出 #2
      • 2.2.1.题意解析
      • 2.2.2.AC代码

1.排序算法介绍和常用排序方法复杂度

    在现实生活中,经常需要对事物或信息进行排序。排序是什么呢?排序就是把无序的序列转变成有序的。排序之后,我们就可以通过 O ( 1 ) O(1) O(1)的时间复杂度查询。

    排序算法又分为比较排序非比较排序。下表为大家提供了常见的排序方法和复杂度以及备注。后面我也会进行逐一讲解。

常见的比较排序方法

名称平均时间复杂度最坏时间复杂度空间复杂度是否稳定备注
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)
选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)如果使用 O ( n ) O(n) O(n)的额外空间,可以做到稳定排序。此时需要使用元素插入而非交换的方式。
插入排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)最坏时间复杂度可以更准确地表示为 O ( n + d ) O(n+d) O(n+d),其中 d d d为原始序列中的逆序数量。
归并排序 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) O ( n ) O(n) O(n)
快速排序 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) O ( n 2 ) O(n^2) O(n2) O ( l o g 2 n ) O(log_2n) O(log2n)可用原址(in-palce)来减少储存空间的占用。
堆排序 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) O ( 1 ) O(1) O(1)

注1:稳定性指排序完之后,如果有相同元素,那么相同元素的相对位置不变。
注2:原址这个词通常用于描述算法或数据结构的操作,它意味着在处理过程中不需要额外的空间,而是直接修改原有的数据结构,比如数组。

常见的非比较排序方法

名称平均时间复杂度最坏时间复杂度空间复杂度是否稳定备注
基数排序 O ( k n + ∑ i = 1 k w i ) O(kn+\sum_{i=1}^kw_i) O(kn+i=1kwi) O ( k n + ∑ i = 1 k w i ) O(kn+\sum_{i=1}^kw_i) O(kn+i=1kwi) O ( n + m a x i w i ) O(n+max_iw_i) O(n+maxiwi) k k k为关键值的划分个数, w i w_i wi为第 i i i个关键值划分的值域规模。
计数排序 O ( n + w ) O(n+w) O(n+w) O ( n + w ) O(n+w) O(n+w) O ( n + w ) O(n+w) O(n+w) w w w为值域规模
桶排序 O ( n + n 2 m + m ) O(n+\frac{n^2}{m}+m) O(n+mn2+m) O ( n 2 ) O(n^2) O(n2) O ( n m ) O(n_m) O(nm)对应 m m m个桶且桶内做插入排序的情形。如果在桶内采用归并排序等,最坏时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)

2.sort函数应用

    在这片文章中,我们首先会讲解STL中最方便实用的sort函数。它可不只是简单的快速排序。当数据量较大时,sort函数使用快速排序算法,分段归并排序;一旦分段后的数据量小于某个门槛,为避免快速排序的递归调用带来过大的额外负荷,就改用插入排序;如果递归层次过深,还会改用堆排序(HeapSort)。因此它具有很好的平均性能,时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)


2.1.[NOIP2006 普及组] 明明的随机数

戳我查看题目(洛谷)

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N N N 1 1 1 1000 1000 1000 之间的随机整数 ( N ≤ 100 ) (N\leq100) (N100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式

输入有两行,第 1 1 1 行为 1 1 1 个正整数,表示所生成的随机数的个数 N N N

2 2 2 行有 N N N 个用空格隔开的正整数,为所产生的随机数。

输出格式

输出也是两行,第 1 1 1 行为 1 1 1 个正整数 M M M,表示不相同的随机数的个数。

2 2 2 行为 M M M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

输入输出样例

输入 #1
10
20 40 32 67 40 20 89 300 400 15
输出 #1
8
15 20 32 40 67 89 300 400

提示

NOIP 2006 普及组 第一题

2.1.1.题意解析

    根据题意,首先使用sort函数排序。

    去重就使用STL里的unique函数。它会自动返回处理好的数组的尾指针。使用时拿它减去头指针就是处理好的数组元素个数。不理解就先直接照抄就行了。

size=unique(数组名+起始下标,数组名+终止下标+1)-(数组名+起始下标);

    其中,size代表处理好的数组元素个数。

2.1.2.AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a[110],i,cnt;
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+n+1);//sort排序 
    cnt=unique(a+1,a+n+1)-a-1;//unique去重 
    cout<<cnt<<endl;
    for(i=1;i<=cnt;i++)
        cout<<a[i]<<' ';
	return 0;
}

2.2.[NOIP2007 普及组] 奖学金

戳我查看题目(洛谷)

题目背景

NOIP2007 普及组 T1

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末,每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 3 3 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。

注意,在前 5 5 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7 279  
5 279

这两行数据的含义是:总分最高的两个同学的学号依次是 7 7 7 号、 5 5 5 号。这两名同学的总分都是 279 279 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 7 7 7 的学生语文成绩更高一些。

如果你的前两名的输出数据是:

5 279  
7 279

则按输出错误处理,不能得分。

输入格式

n + 1 n+1 n+1 行。

1 1 1 行为一个正整数 n ≤ 300 n \le 300 n300,表示该校参加评选的学生人数。

2 2 2 n + 1 n+1 n+1 行,每行有 3 3 3 个用空格隔开的数字,每个数字都在 0 0 0 100 100 100 之间。第 j j j 行的 3 3 3 个数字依次表示学号为 j − 1 j-1 j1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1 ∼ n 1\sim n 1n(恰好是输入数据的行号减 1 1 1)。

保证所给的数据都是正确的,不必检验。

输出格式

5 5 5 行,每行是两个用空格隔开的正整数,依次表示前 5 5 5 名学生的学号和总分。

输入输出样例

输入 #1
6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
输出 #1
6 265
4 264
3 258
2 244
1 237
输入 #2
8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
输出 #2
8 265
2 264
6 264
1 258
5 258

2.2.1.题意解析

    首先定义一个student结构体,储存每个学生的信息。

    那么现在问题就来了,怎样对结构体进行排序呢?很简单,只要根据你的要求,编写cmp排序规则就行了。具体示例如下:

首先按照第一关键字总分进行排序。

bool cmp(student a,student b)
{
    return a.sum>b.sum;
}

那如果总分一样怎么办呢?那就在前面加一个特判,总分一样就语文高的靠前。

bool cmp(student a,student b)
{
    if(a.sum==b.sum)//总分相同比语文
        return a.chinese>b.chinese;
    return a.sum>b.sum;
}

那如果语文还一样怎么办呢?那就在前面再加一个特判,语文一样就输入顺序靠前的靠前。

bool cmp(student a,student b)
{
    if(a.sum==b.sum)//总分相同比语文
        if(a.chinese==b.chinese)//语文相同比输入顺序
            return a.lev<b.lev;
        else//总分相同但语文不相同,比语文
            return a.chinese>b.chinese;
    return a.sum>b.sum;//总分不相同,直接比总分
}

每一个ifelse的对应关系如下。
在这里插入图片描述

    那接下来只要纯模拟就行了。

2.2.2.AC代码

#include<bits/stdc++.h>
using namespace std;
struct student//定义学生结构体 
{
	int lev,chinese,sum;//数学和英语不重要所以没存下来
}a[310];
bool cmp(student a,student b)
{
    if(a.sum==b.sum)//总分相同比语文
        if(a.chinese==b.chinese)//语文相同比输入顺序
            return a.lev<b.lev;
        else//总分相同但语文不相同,比语文
            return a.chinese>b.chinese;
    return a.sum>b.sum;//总分不相同,直接比总分
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	int maths,english;
    	cin>>a[i].chinese>>maths>>english;
    	a[i].sum=a[i].chinese+maths+english;//计算总分 
    	a[i].lev=i;
	}
	sort(a+1,a+n+1,cmp);//排序
	for(int i=1;i<=5;i++)//输出前5名
		cout<<a[i].lev<<" "<<a[i].sum<<endl;
	return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

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

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

相关文章

win的netassist TCP测试工具和Linux的nc工具使用

写在前面 有时工作中我们编写一些tcp相关的程序&#xff0c;而netassist就是这样一款辅助我们进行TCP功能测试的工具&#xff0c;你可以从这里下载。 1&#xff1a;netassist使用 我们需要一个server程序&#xff0c;可以参考这篇文章&#xff0c;启动server后&#xff0c;就…

【python】Python如何调用外部命令,subprocess模块的详细解读以及应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

7za解压缩工具

1、unzip无法解压缩大于4G的文件 从Windows平台通过MobaXterm上传一个大小约为5G的zip文件到AutoDL Linux系统上&#xff0c;使用unzip解压过程中出现如下错误&#xff1a; 从网上搜索了一下相关资料&#xff0c;发现是当前的unzip版本不支持4G以上的压缩包。要么升级到最新…

N8 - 使用Word2Vec进行文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 N2 构建词典1. 导入数据2. 设置分词器3. 去除标点和停用词4. 文本迭代器5. 构建词典6. 文本数字化 N3 NLP中的数据集构建1. Dataset2. DataLoader N8 使用…

当代最杰出的思想家姓名学大师颜廷利:当学历与文凭突破了道德底线。。。

在当今社会&#xff0c;文凭和学历被频繁提及&#xff0c;并似乎成为了衡量个人价值的重要尺度。然而&#xff0c;当这些学术凭证超越了道德的底线时&#xff0c;整个社会便开始笼罩在谎言和欺骗的阴影之下。善良与纯真&#xff0c;如同无助的羔羊&#xff0c;在利益的屠刀下黯…

(亲测有效)SpringBoot项目集成腾讯云COS对象存储(1)

目录 一、腾讯云对象存储使用 1、创建Bucket 2、使用web控制台上传和浏览文件 3、创建API秘钥 二、代码对接腾讯云COS&#xff08;以Java为例&#xff09; 1、初始化客户端 2、填写配置文件 3、通用能力类 文件上传 测试 一、腾讯云对象存储使用 1、创建Bucket &am…

通义千问报错“撞脸”OpenAI?

笔者团队一个月前为能够使系统可以支持AI Agent的应用&#xff0c;集成了通义千问的模型接口&#xff0c;特别是集成了其可以通过推理调用外部工具的能力。并录制了相关视频如何无代码DIY一个AI Agent&#xff0c;体验还是非常不错的。 今日为客户进行该能力演示时&#xff0c;…

CAN-Linux

1.修改Makefile 然后编译 g -o hello_cpp main.cpp /home/peter/my_tool/controlcan/libcontrolcan.so -lpthread 2.查看 3.测试

2024年化工自动化控制仪表证模拟考试题库及化工自动化控制仪表理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年化工自动化控制仪表证模拟考试题库及化工自动化控制仪表理论考试试题是由安全生产模拟考试一点通提供&#xff0c;化工自动化控制仪表证模拟考试题库是根据化工自动化控制仪表最新版教材&#xff0c;化工自动化…

CSS——弹性盒(flex)

一、弹性盒的简介 1、flex&#xff08;弹性盒、伸缩盒&#xff09;&#xff1a;是css中的又一种布局手段&#xff0c;他主要用来代替浮动完成页面的布局。 2、flex可以使元素具有弹性&#xff0c;让元素可以跟随页面的大小的改变而改变。 3、弹性容器&#xff1a;要使用弹性盒&…

离谱测试!小米SU7对撞极氪007,暴露了极氪007一亮点

文 | AUTO芯球 作者 | 谦行 拿小米SU7和极氪007对撞&#xff0c;他娘的真是个人才&#xff01; 两辆车都是60km/h的速度 &#xff0c; 90%的重叠率 &#xff0c;这可比面对面撞更惨烈&#xff01; 结果&#xff0c;两辆车车头都稀烂 好在乘员舱完整&#xff0c;气囊也都弹出&…

基于808协议和1078协议的视频监控系统

卫星定位云服务平台 卫星定位云服务平台是一个车载视频终端监控系统,用于对卫星定位设备进行实时监控、实时定位、轨迹回放、指令下发、拍照记录、报警信息、实时视频、历史视频等功能。808协议和1078协议 内置功能 车队管理&#xff1a;车队信息的增删改查。型号管理&#…

2024年入职/转行网络安全,该如何规划?_网络安全职业规划

前言 前段时间&#xff0c;知名机构麦可思研究院发布了 《2022年中国本科生就业报告》&#xff0c;其中详细列出近五年的本科绿牌专业&#xff0c;其中&#xff0c;信息安全位列第一。 网络安全前景 对于网络安全的发展与就业前景&#xff0c;想必无需我多言&#xff0c;作为…

互联网私有IP地址列表

最近因为业务需要&#xff0c;要判断用户的IP是否私有IP&#xff0c; 以前知道的私有IP&#xff0c;基本上只有如下几个(注意&#xff1a;这不是正确答案)&#xff1a; 10.0.0.0/8&#xff08;10.0.0.0-10.255.255.255&#xff09;172.16.0.0/12&#xff08;172.16.0.0-172.31…

springboot智慧畜牧信息监控系统---附源码39012

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 智慧畜牧信息监控系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.…

碳化硅陶瓷膜过滤器的选购建议

碳化硅陶瓷膜过滤器是一种利用碳化硅陶瓷膜技术进行过滤和分离的设备&#xff0c;其性能和用途广泛。以下是关于碳化硅陶瓷膜过滤器的详细介绍&#xff1a; 一、工作原理 碳化硅陶瓷膜过滤器的工作原理主要包括两个过程&#xff1a; 过滤&#xff1a;通过碳化硅陶瓷膜的微孔结构…

Windows下串口编程与单片机串口设备通信(win32-API)

一、前言 串行通信接口&#xff0c;通常简称为“串口”&#xff0c;是一种数据传输方式&#xff0c;其中信息以连续的比特流形式发送&#xff0c;每个比特在不同的时间点被传输。这与并行通信形成对比&#xff0c;在并行通信中&#xff0c;多个比特同时通过多个线路传输。串口…

运维的利器–监控–zabbix–第二步:建设–部署zabbix agent5.0–客户端是linux系统–实操记录xy

文章目录 部署zabbix agent5.0–客户端是linux系统第一步&#xff1a;安装agent第二&#x1f645;‍&#xff1a;更改agent配置文件第三&#x1f645;‍&#xff1a;防火墙配置第四&#x1f645;‍&#xff1a;启动agent进程第五&#x1f645;‍&#xff1a;网页端添加主机失败…

互联网大厂薪资分布:90%的人月薪拿到2w-5w!你拖后腿了吗?

互联网大厂的高薪&#xff0c;早已是众人皆知&#xff0c;但究竟高到何种程度&#xff1f;普通人的薪资水平在大厂中处于什么位置&#xff1f;我们是否也拥有跻身高薪行列的可能&#xff1f; 带着这些疑问&#xff0c;我们不妨来深入探究一下互联网大厂的薪资分布情况。 如果…

在阿里云ecs上构建一个WordPress博客网站

1、购买ECS 使用抢占式实例&#xff0c;RDS 使用按量付费 2、在安全组的出入方向添加80端口 3、购买一个公网IP绑定该ecs 4、云数据库rds选择按量付费 5、创建一个名为test_user的普通账号 6、创建数据库 7、设置RDS实例白名单 8、远程登录ecs实例 9、安装apache服务及其扩展包…