蓝桥杯: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.hqwc.cn/news/471291.html

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

相关文章

linux的make和makefile

一.什么是make和makefile makefile作用&#xff1a; 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重…

【python之美】减少人工成本之批量修改TXT文件名称_2

批量修改文件名称 怎么批量创建txt文件&#xff0c;看上期特产 源文件如下&#xff1a; 批量修改代码 import ospath "C:\\Users\\Administrator\\Desktop\\text\\" file_names os.listdir(path) print(file_names)i 1 for file_name in file_names:name fil…

VueCLI核心知识4:动画效果、过渡效果

1 动画效果 【代码】 <template><div><button click"isShow !isShow">显示/隐藏</button><!-- <transition name"xxx" :appear"true"> 可以指定name属性&#xff0c;也可以不指定&#xff0c;name属性在有…

数据分析 | 手敲皮尔逊相关系数计算代码 | Python

import random random.seed(42) import numpy as np计算均值 def mean(x):return sum(x) / len(x)计算偏差 def derta(x):x_bar mean(x)result [x_i - x_bar for x_i in x]return result计算协方差 def covariance(a, b):dot_list [a_i * b_i for a_i, b_i in zip(derta(a),…

Codeforces Round 926 (Div. 2)(A~D)

文章目录 ABCD A 输出最大值减最小值&#xff0c;或者排序算一下答案 #include <bits/stdc.h> #define int long long #define rep(i,a,b) for(int i (a); i < (b); i) #define fep(i,a,b) for(int i (a); i > (b); --i) #define pii pair<int, int> #d…

拿捏单链表

目录 引言 一&#xff1a;链表的定义 二&#xff1a;单链表的定义 三&#xff1a;单链表的增删查改 1.单链表增删查改及遍历的声明 注&#xff1a;在测试中创建指向头结点的指针plist 2.二级指针应用的说明 3.单链表的遍历 4.创建节点 5.单链表的插入 (1)头插 …

抖音私信自动回复工具使用教程!

该工具基于网页版抖音&#xff0c;可以用于抖音个人号等任何权限的账号&#xff01; 获取软件 联系我的v 信&#xff1a;llike620 基本使用 了解GPT的&#xff0c;可以配置FastGPT这种训练知识库的AI进行回复 不了解的&#xff0c;可以配置关键词回复 点击抖音私信按钮&a…

【leetcode994】腐烂的橘子(BFS)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 首先将所有烂橘子入队&#xff0c;然后常规BFS遍历&#xff0c;注意while的截止条件除了队列为空&#xff0c;新鲜橘子数量大于0&#xff08;没新鲜橘子也没必要继续遍历&#xff0c;保证时间计算的正确性&#xff09;&a…

关于Build Your Own Botnet的尝试

这是一次失败的尝试、 原文地址&#xff1a;关于Build Your Own Botnet的尝试 - Pleasure的博客 下面是正文内容&#xff1a; 前言 我在上一篇关于DDOS的文章种提到过这个项目&#xff0c;而且说明了由于这个项目是在2020年发布并开源的&#xff0c;并且已经有两年没有进行跟…

HMI界面:感官与体验俱佳的智能家居界面分享

Hello&#xff0c;我是大千UI工场&#xff0c;本期分享HMI人机交互界面在智能家居领域的案例&#xff0c;关注大千&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;可以联络。 设计感官和体验俱佳智能家居的UI界面时&#xff0c;可以考虑以下几个方面&#xff1a;…

【王道数据结构】【chapter5树与二叉树】【P159t17~19】【统考真题】

目录 2014年统考 2017年统考 2022年统考 2014年统考 #include <iostream> #include <stack> #include <queue> typedef struct treenode{int weight;struct treenode *left;struct treenode *right; }treenode,*ptreenode;ptreenode buytreenode(int x) {p…

python----输入输出算数运算

1.格式化输出 如果我们直接打印输出&#xff0c;就是输出变量的值&#xff0c;例如&#xff1a; 如果我们想打印a10就需要格式化字符串&#xff0c;就是使用f进行格式化&#xff0c;如图所示&#xff1b; 2.控制台输入 input执行的时候&#xff0c;就会等待用户进行输入&…