蓝桥杯:C++排序

排序

排序和排列是算法题目常见的基本算法。几乎每次蓝桥杯软件类大赛都有题目会用到排序或排列。常见的排序算法如下。

第(3)种排序算法不是基于比较的,而是对数值按位划分,按照以空间换取时间的思路来排序。看起来它们的复杂度更好,但实际上它们的应用环境比较苛刻,在很多情况下并不比前几种排序算法更好。

排序是基本的数据处理,读者需要认真体会这些算法的思路和操作方法。不过,在算法竞赛中,一般不需要手动编写这些排序算法,而是直接使用库函数,例如C++的sort()函数。

STL的排序函数sort()有以下两种定义:

(1)void sort (RandomAccessIterator first, RandomAccessIterator last);

(2)void sort (RandomAccessIterator first, RandomAccessIterator last,Compare comp);

简称:前闭后开。

sort()支持从大到小的排序,也支持从小到大的排序。sort()自带4种排序:less、greater、less_equal、greater_equal。默认情况下,sort()按从小到大进行排序,less可以不写。

代码演示:

#include<bits/stdc++.h>
using namespace std;
bool my_less(int i, int j)     {return (i < j);   //自定义小于函数
}
bool my_greater(int i, int j)  {return (i > j);   //自定义大于函数
}
int main () {int a[]= {3,7,2,5,6,8,5,4};sort(a,a+4);                          //对前4个数排序,结果:2 3 5 7 6 8 5 4for(int i=0; i<8; i++) cout<<a[i]<< " ";cout<<”\n”;   //下面可以复制这一行输出sort(a,a+8,less<int>());              //从小到大排序,结果:2 3 4 5 5 6 7 8sort(a,a+8,my_less);                  //自定义排序,结果:2 3 4 5 5 6 7 8sort(a,a+8,greater<int>());           //从大到小排序,结果:8 7 6 5 5 4 3 2sort(a,a+8,my_greater);               //自定义排序,结果:8 7 6 5 5 4 3 2vector<int> c = {1,2,3,4,5,6,7,8};sort(c.begin(),c.end(),my_greater);   //结果:8 7 6 5 4 3 2 1for(int i=0; i<c.size(); i++)  cout<<c[i]<< " ";cout<< "\n";string s="hello world";  sort(s.begin(),s.end());cout<<s;                              //输出:dehllloorw。注意第一个是空格return 0;
}

C++的sort()有两个优点:能在原数组上排序,不需要新的空间;能在数组的局部区间上排序。

例题1-统计数字

代码:

#include<bits/stdc++.h>
using namespace std;
int nums[200010];//n<=200000,我们多申请一点,多10就行了。
int main() {int n;scanf("%d",&n);for(int i = 1; i <= n; i++)    scanf("%d",&nums[i]);sort(nums+1, nums+1+n);int cnt = 0;for(int i = 1; i <= n; i++) {cnt++;//某个数出现的次数if(nums[i] != nums[i+1]) {printf("%d %d\n", nums[i], cnt);  //说明这个数结束了,轮到下一个数了,记录一次cnt = 0;  //置0,重新计数}}
}

例题2-错误票据

题目分析:本题是简单题,解题思路是读取所有数字,先排序,然后查找丢失的数字和重复的数字。本题的麻烦之处是输入的处理。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10;//申请的数组比预期的要大一点。
int a[N];
int main() {int n;cin >> n;int cnt = 0;while(scanf("%d", &a[cnt]) != EOF)   cnt++;    //注意读数据的写法,下面会讲解sort(a, a+cnt);//排序int ans1, ans2;for(int i = 1; i < cnt; i++) {if(a[i] - a[i-1] > 1)   ans1 = a[i-1]+1;   //查找断号if(a[i] == a[i-1])      ans2 = a[i];       //查找重号}cout << ans1 <<  " " << ans2;return 0;
}

比赛经常有这样的代码:while(scanf(“%d%d”)!=EOF),这玩意啥意思呢?首先scanf你写while里就很奇怪了,初学者表示没见过这么嵌套写的,再加个EOF更离谱了。

首先这个代码scanf能写while里是因为scanf(“%d%d”)!=EOF本身是个逻辑判断,也就是真或者假,所以可以作为条件判断写到while里。

EOF到底啥玩意?

您不妨打开我们最常用的stdio.h这个头文件,然后搜索EOF即可发现答案!(蓝桥杯指定编译器devcpp中怎么打开这个文件呢?按住ctrl然后用鼠标点击stdio.h即可进入)

找到了:

EOF其实就是-1!

也就是说EOF就是个数字,被定义为-1而已!

在我们进行包括scanf等的输入函数使用时,其实用户在cmd中的输入实际是存放于缓冲区当中,当用户键入回车那一瞬间,之前输入的数据才会被存进去,而这里无论是单个字符还是字符串,我们都知道scanf的返回值呢是表示成功接受到的对象的个数,那这里如果遇到特殊情况,比如缓冲区文件流满等问题,那么scanf将如何处理呢?答案是返回-1 ! 这里不光是scanf,返回值为个数的函数,遇到文件流满大多都会返回-1,所以这个-1用的比较多,那么stdio.h就索性专门定义一个宏来表示,取End Of File(文件末尾的意思)的前三个字母即组成EOF,所以也就有了 #define EOF (-1) 这样的话!

例题3.结构体排序

代码:

#include<bits/stdc++.h>
using namespace std;
struct stu {int id;      //学号int c,m,e;   //语文、数学、英语成绩int sum;
} st[305];
bool cmp(stu a,stu b) {if(a.sum > b.sum)       return True;else if(a.sum < b.sum)  return False;else {                                //a.sum == b.sumif(a.c > b.c)       return True;else if(a.c < b.c)  return False;else {                            //a.c == b.cif(a.id > b.id) return False;else return True;}}
}
int main() {int n;cin>>n;for(int i=1; i<=n; i++) {st[i].id = i;                              //学号cin >> st[i].c >> st[i].m >> st[i].e;st[i].sum = st[i].c + st[i].m + st[i].e;   //总分}sort(st+1,st+1+n,cmp);for(int i=1; i<=n; i++)  cout<<st[i].id<<" "<<st[i].sum<< endl;return 0;
}

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

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

相关文章

ADC--模拟量转换成数字量

目录 一、ADC硬件组成七大部分&#xff1a; 二、单次转换&#xff0c;连续转换&#xff0c;不连续采样模式&#xff0c;扫描模式区别 1、举例(5种组合情况) 2、模拟看门狗中断的作用&#xff1a; 三、MCU使用ADC步骤 一、ADC硬件组成七大部分&#xff1a; ①输入电压&#…

Java数字孪生智慧工地数据大屏APP项目源码

目录 智慧工地云平台核心功能 1.劳务管理 2.视频监控 3.安全教育 4.进度管理 5.环境监测 6.塔吊监控 7.升降机监控 8.工地广播 9.深基坑高支模 10.AI识别 11.安全质量 智慧工地建设的价值和意义 危大工程管理 智慧工地聚焦施工现场一线生产活动&#xff0c;利用物…

使用Python生成二维码的完整指南

无边落木萧萧下&#xff0c;不如跟着可莉一起游~ 可莉将这篇博客收录在了&#xff1a;《Python》 可莉推荐的优质博主首页&#xff1a;Kevin ’ s blog 本文将介绍如何使用Python中的qrcode库来生成二维码。通过简单的代码示例和详细解释&#xff0c;读者将学习如何在Python中轻…

数据结构-双指针法

介绍 双指针法是一种可以在O&#xff08;n&#xff09;时间复杂度内解决数组、链表、字符串等数据结构相关的问题的方法。核心思想为使用两个指针在不同位置遍历数组或链表&#xff0c;从而实现特定操作。 常见的双指针法有 1.快慢指针&#xff1a;快指针每次移动两步&…

单测的思路

文章目录 单测的分类方法的单测生成工具的对比生成步骤 接口的单测mock步骤部分依赖mock的方式 场景的单测参考 单测的分类 单元测试&#xff08;Unit Testing&#xff09;是一种软件开发中的测试方法&#xff0c;它的主要目的是确保软件中的最小可测试单元&#xff08;通常是…

(07)Hive——窗口函数详解

一、 窗口函数知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路&#xff1a; LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowing…

英文论文(sci)解读复现【NO.21】一种基于空间坐标的轻量级目标检测器无人机航空图像的自注意

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

红队笔记Day3-->隧道上线不出网机器

昨天讲了通过代理的形式&#xff08;端口转发&#xff09;实现了上线不出网的机器&#xff0c;那么今天就来讲一下如何通过隧道上线不出网机器 目录 1.网络拓扑 2.开始做隧道&#xff1f;No&#xff01;&#xff01;&#xff01; 3.icmp隧道 4.HTTP隧道 5.SSH隧道 1.什么…

探索未来科技前沿:深度学习的进展与应用

深度学习的进展 摘要&#xff1a;深度学习作为人工智能领域的重要分支&#xff0c;近年来取得了巨大的进展&#xff0c;并在各个领域展现出惊人的应用潜力。本文将介绍深度学习的发展历程、技术原理以及在图像识别、自然语言处理等领域的应用&#xff0c;展望深度学习在未来的…

RunnerGo:UI自动化测试神器!

UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势&#xff0c;包括提高测试效率、减少人力成本、提升软件质量等。同时&#xff0c;可视化工具为UI自动化测试带来了更多便利和灵活性。RunnerGo近期上线脚本录制器&#xff0c;根据你的测试操作直接…

React 更改程序入口点(index.js文件位置变更)

食用前提示&#xff1a;本文基于已经快速配置好的React环境而作&#xff0c;配置React环境详见拙作&#xff1a;React环境配置-CSDN博客~ 一、了解默认入口点 使用create-react-app快速搭建react环境后&#xff0c;npm start启动程序的默认入口点为/src/index(即src目录下的ind…

【Prometheus】组件介绍-工作流程-部署模式-数据类型-监控

基于Prometheus和K8S构建智能化告警系统 一、Prometheus简介二、Prometheus特点于样本2.1、特点2.2、样本 三、Prometheus组件介绍四、Prometheus工作流程五、Prometheus的几种部署模式5.1、基本高可用模式5.2、基本高可用远程存储5.3、基本高可用远程存储联邦集群 六、Prometh…

ESP32工程中CMake使用及加入第三方SDK库文件

1、ESP32工程结构 本文中使用的是乐鑫官方推出的ESP-IDF v5.1对ESP32S3设备开发&#xff0c;并非是Arduino、Micro-python等第三方工具开发。在ESP-IDF框架中&#xff0c;乐鑫官方已经将CMake 和 Ninja 编译构建工具集成到了ESP-IDF中。 ESP-IDF 即乐鑫物联网开发框架&#xff…

卷积神经网络的基本结构

卷积神经网络的基本结构 与传统的全连接神经网络一样&#xff0c;卷积神经网络依然是一个层级网络&#xff0c;只不过层的功能和形式发生了变化。 典型的CNN结构包括&#xff1a; 数据输入层&#xff08;Input Layer&#xff09;卷积层&#xff08;Convolutional Layer&#x…

第11章 GUI

11.1 Swing概述 Swing是Java语言开发图形化界面的一个工具包。它以抽象窗口工具包&#xff08;AWT&#xff09;为基础&#xff0c;使跨平台应用程序可以使用可插拔的外观风格。Swing拥有丰富的库和组件&#xff0c;使用非常灵活&#xff0c;开发人员只用很少的代码就可以创建出…

力扣OJ题——旋转数组

题目&#xff1a;189.旋转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 思路一&#xff1a; 1.每次挪动旋转1位&#xff08;用tmp将最后一位存起来&#xff0c;其余所有数据向后移&#xff0c;然后将tmp放在第一个位…

Python编程中的异常处理

什么是异常&#xff1f; 程序错误&#xff08;errors&#xff09;有时也被称为程序异常&#xff08;exceptions&#xff09;&#xff0c;这是每个编程人员都会经常遇到的问题。在过去&#xff0c;当遇到这类情况时&#xff0c;程序会终止执行并显示错误信息&#xff0c;通常是…

Qt:Qt3个窗口类的区别、VS与QT项目转换

一、Qt3个窗口类的区别 QMainWindow&#xff1a;包含菜单栏、工具栏、状态栏 QWidget&#xff1a;普通的一个窗口&#xff0c;什么也不包括 QDialog&#xff1a;对话框&#xff0c;常用来做登录窗口、弹出窗口&#xff08;例如设置页面&#xff09; QDialog实现简易登录界面…

力扣经典题:环形链表的检测与返回

1.值得背的题 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fasthead;struct ListNode*slowhead;while(fast!NULL&&fast->…

LCR 127. 跳跃训练【简单】

LCR 127. 跳跃训练 题目描述&#xff1a; 今天的有氧运动训练内容是在一个长条形的平台上跳跃。平台有 num 个小格子&#xff0c;每次可以选择跳 一个格子 或者 两个格子。请返回在训练过程中&#xff0c;学员们共有多少种不同的跳跃方式。 结果可能过大&#xff0c;因此结果…