![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 52
灯珑
春暖花开谈恋爱,不如专心搞竞赛
展开
-
C语言实现编译期断言
编译期断言是一种对编译期能计算出来的常量的值进行断言,从而避免代码中引入一些不合理的值。原创 2022-10-06 16:05:55 · 263 阅读 · 0 评论 -
【论文阅读笔记】Myers的O(ND)时间复杂度的高效的diff算法
前言之前咱们三个同学做了个Simple-SCM,我负责那个Merge模块,也就是对两个不同分支的代码进行合并。当时为了简便起见,遇到文件冲突的时候,就直接按照文件的更改日期来存储,直接把更改日期较新的那个文件认为是我们要保留的文件版本。但是这样子做是存在很多问题的,因为这样做就无法对不同分支的代码他们各自的特性进行整合,最终保留的只是其中一个分支的代码。因此,加入按行进行比较的diff算法是非常必要的。然后,本着自力更生的理念,我希望能够自己写出这个代码,然后把它应用到Simple-SCM之中。今年原创 2021-12-24 15:24:31 · 1396 阅读 · 0 评论 -
动态规划之硬币问题
现有面值为c1,c2,c3,…,cm的m种硬币,求支付n元时所需硬币的最少枚数。各面值的硬币可以使用任意次首先最开始想到的是贪心算法,也就是从最大面值的硬币开始用。但是贪心算法只关注当前的最优解,所得结果不一定是全局最优解。举个例子,当面值为1、2、7、8、12、50时,我们如果需要支付15元,用贪心算法来算的话,就会出现12、2、1的结果,需要三枚硬币。但是事实上,我们只需要7、8元面值的两枚硬币就够了。所以,硬币问题可以用动态规划来求解。用c[i]来存储硬币的面值,用T[j]来存储支付j原创 2021-09-07 20:18:24 · 2225 阅读 · 0 评论 -
扩展欧几里得算法
欧几里得算法欧几里得算法是用来求最大公约数的,gcd(a,b)=gcd(b, a%b),如此递归下去,直到a%b==0,然后返回。最终,gcd(a,b)=gcd(c,0),其中,a,b的最大公约数就是c扩展欧几里得算法(exgcd)扩展欧几里得算法是解决诸如:求整数x和y使得ax+by=gcd(a,b)的问题的。这里借用oi-wiki中的证明:然后,代码如下:int Exgcd(int a, int b, int &x, int &y) { i.原创 2021-09-07 20:17:59 · 203 阅读 · 0 评论 -
POJ3255:求解[次短路]->Dijkstra
题目:http://poj.org/problem?id=3255RoadblocksTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 28456 Accepted: 9683DescriptionBessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not wan原创 2021-08-31 22:32:30 · 118 阅读 · 0 评论 -
POJ1182(食物链):种类并查集
Description动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是”1 X Y”,表示X和Y是同类。第二种说法是”2 X Y”,表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。1)原创 2021-08-31 20:25:16 · 124 阅读 · 0 评论 -
二分图最大匹配问题(匈牙利算法)
什么是二分图如果一个无向图的的顶点可以分为两个互不相交的子集A和B,那么它就是二分图。也就是说,A、B内部不存在连边,所有连边都一头连着A中的顶点,另一头连着B中的顶点。什么是二分图最大匹配?二分图最大匹配问题,就是在A、B这两个集合中,不断选择两个存在连线的点,把他们连起来,求最多可以有多少条连线的问题。怎么解?匈牙利算法的核心在于:从A集合中选择一个点,然后将与其相连的B中的点依次对照,如果B中的点尚未匹配,那就将这两个点进行匹配,然后遍历A中的下一个点。接着继续访问与其相连的B原创 2021-08-31 20:21:46 · 1067 阅读 · 0 评论 -
【题解】Gym – 102307C Common Subsequence
题目:Manuel thinks that Diego is his long lost brother. But Diego thinks Manuel is wrong, and to prove it, he got DNA samples from himself and Manuel. Now Diego has given you the DNA samples and it is your task to say whether they are brothers or not.Th原创 2021-08-31 20:19:53 · 187 阅读 · 0 评论 -
【题解】HDU7046(数学推导)
题目:https://acm.hdu.edu.cn/showproblem.php?pid=7046题目来源:2021“MINIEYE杯”中国大学生算法设计超级联赛(7)题目大概要求就是求按照给定的规则画出的图形的凸包大小。乍一看是计算几何的题目,然后再细想,其实就是一题数学推导的题目。先画出内容,然后手动推一下边长的公式,然后就可以推出面积公式,直接计算就可以了。AC代码#include <bits/stdc++.h>using namespace std;原创 2021-08-31 20:17:01 · 101 阅读 · 0 评论 -
树形DP简介
树形dp就是在树上进行的dp。由于树具有递归的性质,因此树形dp一半都是用递归的方式进行的。问题的大意是,选了父节点,那么它的直接子节点就不能被选择,求总的权值的最大值。题目:P1352 没有上司的舞会这题是树形dp的板子题,每个节点都有被选择和不被选择两种情况。用数组dp[n][0]记录第n个节点不被选择的情况,用数组dp[n][1]记录被选择的情况。那么就有状态转移方程dp[n][0] = Σ(max(dp[x][0],dp[x][1]),其中,x是n的所有子节点dp[n原创 2021-06-13 22:59:54 · 3697 阅读 · 0 评论 -
动态规划之最长递增子序列
最长递增子序列的问题就是:给定序列A=a0,a1,a2,…,an,如果它的子序列b1,b2,…,bn满足b1<b2<b3<…<bn则称这个子序列是一个递增子序列。A的所有子序列中,最长的那个就是最长递增子序列(LIS)这是一个经典的动态规划问题,我们可以用两种方法来解决。第一种是比较笨的纯dp算法。时间复杂度为O(N2).假设原序列存储于A[n+1]中,注意,序列从A[1]开始存储方法是使用两个数组:L[n+1] 用于存储A[1]到A[i]中,部原创 2021-04-06 23:04:22 · 1414 阅读 · 1 评论 -
计算几何之线段相交问题(平面扫描)
给出n条平行于x轴或y轴的线段,输出其交点数求n条线段的交点,可以用抽选配对的方式来遍历所有的情况,这样子时间复杂度为O(n2).与轴平行的线段相交问题(曼哈顿几何)可以通过平面扫描(sweep)高效求解。平面扫描算法的思路是将一条与x轴(y轴)平行的直线向上(向右)平行移动,在移动过程中寻找交点,这条直线被称为扫描线。扫描线在每次遇到平面上线段的端点的时候停止移动,并且检查该位置上的线段交点。为了进行上述的处理,我们需要先将输入的线段的端点按照y的大小进行排序,然后让扫描线向y轴正向移原创 2021-03-18 21:03:31 · 800 阅读 · 0 评论 -
计算几何之求凸包
给出平面上的一堆点,能够包住它的最小凸多边形就称为凸包。求凸包有很多种算法,这里用的是安德鲁算法它包含以下步骤:将给定的点集合按照升序排列。x相同的话,按照y坐标升序排列 按照下列流程创建凸包的上部 将排序后的点按照x坐标从小到大的顺序加入凸包U。如果新加入的点使得U不再是凸多边形,那么就逆序删除之前已经插入U的点,直到U为凸多边形。 按照下列流程创建凸包的下部 将排序后的点按照x坐标从大到小的顺序加入凸包L。如果新加入的点使得L不再是凸多边形,那么就逆序删除之前已经插入L的点,直到原创 2021-03-17 21:03:02 · 262 阅读 · 0 评论 -
C++静态类成员
静态类成员就是不管这个类是否有已实例化的对象存在,这个成员都一直存在。也就是说,静态类成员是绑定在类上的,而不是绑定在对象上的。声明静态类成员的方式就是在函数前加入static关键字。静态类成员通常适用于当一个类的所有对象之间需要共享同一份数据的时候,这样子能节省空间,提高效率。在C++11之前,只有int或者enum类型能在声明的时候被初始化。(但是C++11及以后则不存在这个问题)如何访问静态数据成员?对于public的静态数据成员,我们只需要用类似于Test::da.原创 2021-03-17 10:05:08 · 196 阅读 · 0 评论 -
C++级联函数调用
级联函数调用就是类似于下面这种调用函数的方式:t.setHour(18).setMinute(30).setSecond(22);它可以把原来需要三行的语句压缩到一行,而且很具有可读性要实现这样的调用,就必须在类的成员函数之中,返回一个*this指针,这也是实现级联函数调用的关键。所以,代码实现就像下面这样子:Time.h#pragma onceclass Time{public: explicit Time(int h = 0, int m = 0, int s = 0原创 2021-03-16 23:04:47 · 972 阅读 · 0 评论 -
C++友元函数与友元类
友元函数是一个可以访问类的私有成员的函数,并且它不属于这个类。友元类则是可以访问另一个类的私有成员的类。声明友元函数/友元类,则需要这样做:比如,我们需要生命ClassTwo是ClassOne的友元类,那么我们要在ClassOne中加入这么一行语句:friend class ClassTwo;相应的,声明ClassOne的友元函数也是在ClassOne中加入以下代码:friend void xxx();关于朋友关系的来源:朋友关系是被给予的,而不是主动获得的。..原创 2021-03-15 15:13:58 · 137 阅读 · 0 评论 -
计算几何之点的内包
在计算几何中,判断点是否内包于多边形之中,就是点的内包问题。解决的思路就是,对于给定点p,作一条沿x轴正方向的射线,然后计算这条射线与多边形的边相交的次数。首先判断点p是否在边上,如果在边上的话就直接return如果相交的次数是奇数,那么它就是内包的。否则,点处于多边形的外部。具体求相交次数的方法就是遍历多边形上相邻的两点gigi+1,设向量a = gi– p, b = gi+1– p如果a的y坐标大于b的y坐标,那么就交换a、b这时,如果a、b的外积为正,且a、b的y坐标...原创 2021-03-09 22:32:04 · 141 阅读 · 0 评论 -
E-Early Orders 题解
前两天打了2021年度训练联盟热身训练赛第一场这个e题还是蛮不错的链接:https://ac.nowcoder.com/acm/contest/12606/E样例输入链接:https://ac.nowcoder.com/acm/contest/12606/E来源:牛客网示例1输入6 3321313输出2 1 3示例2输入10 55432141155输出3 2 1 4 5题意大概是:给出一段数字序列,要求按照顺序取元素组成原创 2021-03-09 12:18:10 · 177 阅读 · 0 评论 -
动态规划之0-1背包问题
01背包问题,说白了就是小偷背了个包去偷东西,他背包空间是有限的,问他要怎么拿物品,才能使得总价值最大化?给出背包的最大负荷以及每种物品的质量、价值,问这个背包能最多装下多大价值的物品?这就是0-1背包问题,每个物品只有装与不装两种状态用dp[i][w]来表示前i个物品装入容量为w的背包的时候,总价值的最大值。那么,就可以得知:(其中,c[i]为物品i的价值)dp[i][w] = max(dp[i-1][w],dp[i-1][w-w[i]]+c[i])那么,这个问题就可以解决了。原创 2021-02-22 19:14:48 · 226 阅读 · 0 评论 -
树的直径
求一棵树的直径的方法就是,从一个顶点出发,找到离它最远的顶点s,然后从顶点s出发,找离他最远的节点t.那么,s、t之间的距离就是树的直径。对于加权无向树来说,树的直径就是s、t之间的路径上的边的权值相加。题目:GRL_5_AAC代码:#include <iostream>#include <vector>#include <queue>#include <string.h>#include <algorithm>u.原创 2021-01-31 22:54:33 · 96 阅读 · 0 评论 -
关节点
在连通图G中,如果删除了某个点u之后,得到的子图不连通,那么点u就被称为关节点。求关节点可以用dfs来求。具体就是用到了几个数组表名 意义 dfn[u] 节点u的dfs序 p[u] 节点u的父节点 low[u] (dfn[u]、u的子节点的low值的最小值、u的树枝边的dfn)的最小值 对于无向图来说:关节点的性质有两条:存在至少一条树枝边(u, v) low[v]>=dfn[u] 对于根结点需要特别判断,只要有多于一条树枝边则为割点对于原创 2021-01-31 18:24:54 · 1303 阅读 · 0 评论 -
拓扑排序(广度优先搜索实现)
有向无环图可以用来表示各种事物的顺序,比如工作顺序。一些事情必须在另一些事情完成之后才能开始进行。那么,为了获得正确的工作顺序(一件事情开始之前,必须保证它的前置条件全部满足),就需要用到拓扑排序。拓扑排序其实就是在有向无环图中,只要存在边(u,v),那就让u排在v前面。我们可以通过广度优先搜索或者深度优先搜索来实现拓扑排序。广度优先的思路就是对每个入度为0的且未被访问过的节点进行广度优先搜索。在搜索过程中,只要搜索了u与v之间的边,那就将v的入度减1,相当于删除边的操作。入度为零就代表着它原创 2021-01-31 16:53:17 · 1782 阅读 · 0 评论 -
全点对间最短路径(弗洛伊德算法)
之前学单源最短路径的时候,学到狄克斯特拉算法,我在想,如果对每个顶点都求它的单源最短路径,那不就可以得到全点对之间的最短路径了吗?这样算下来时间复杂度在O(|V|(|V|+|E|)log|V|)但是,狄克斯特拉算法有个问题,不能适用于权值为负数的边,所以,当有权值为负数的边的时候,需要用到弗洛伊德算法。弗洛伊德算法的时间复杂度为O(|V|3),其思想就是动态规划的思想。用A[i,j]来记录从节点i到节点j的最短路径。然后使用一个中间节点k,对于i到j的最短路径,有A[i][j] = min(A[i]原创 2021-01-31 14:24:43 · 1120 阅读 · 0 评论 -
范围搜索(kDTree)
范围搜索是从拥有多个属性的报表集合中,寻找具有特定属性且位于指定范围内的元素,这类问题被称为范围搜索。我们在这里要解决的是二维的范围搜索问题。在二维平面上给出一堆点,然后给出n个矩形框。要求输出在矩形框内的所有点的id。kDtree其实就类似于二叉搜索树(嗯其实差不多就是二叉搜索树)。题目是DSL_2_C我们需要建立2DTree,那就需要对x轴和y轴分别进行排序。实现方式就是,深度为偶数的时候以x轴为基准,深度为奇数时,以y轴为基准。其实这就是二维分割,可以看作是把对一块..原创 2021-01-29 18:22:11 · 1076 阅读 · 0 评论 -
高等数据结构之并查集
并查集是一种用互质的集合对数据进行分类管理的数据结构。并查集主要实现了两个功能:合并与查询我们用一个数组fa[i]来表示第i个元素所在集合的根节点。根节点的父节点指向它自身。初始的时候,我们把fa[i]=i,这样就初始化了n个互质的集合。然后当要合并两个节点x、y所在的集合的时候,就先找到他们的根节点(代表元),然后将一个集合的根节点指向另一个节点的根节点即可。判断两个元素所在集合是否相同,其实就是去找他们所在集合的代表元。代表元相同,那么就证明这两个元素在同一个集合里面。.原创 2021-01-29 13:40:43 · 334 阅读 · 0 评论 -
单源最短路径(狄克斯特拉算法)
在加权图G=(V,E)中,求给定顶点s,d之间各边权值总和最小的路径,这就是最短路径问题。这个问题主要分为两类:单源最短路径:在图G中,求给定顶点s到其他所有顶点di之间的最短路径 全点对间最短路径:在图G中,求“每一对顶点”之间的最短路径求单源最短路径,其实就是求从起点出发的最短路径生成树的过程。如果顶点s到G的所有顶点都存在路径,那么一定存在一棵以s为根,包含s到G所有顶点最短路径的生成树T。这种树就称为最短路径生成树。狄克斯特拉算法解决最短路径生成树问题,就需要用到狄克斯.原创 2021-01-28 17:05:08 · 1204 阅读 · 0 评论 -
博弈论之Nim游戏
•Nim游戏的形式:n堆石子(第i堆有a_i个石子),两人轮流取。每人每次选其中一堆取走任意多个石子(最少一个),无可取者失败。•结果:当且仅当时,先手必败(⊕为异或和,下同)。其它情况下先手必胜。•策略:游戏的结束状态(石子全部取完)时总体异或和为零,先手失败。未结束时,若总异或和不为零,先手每次选取石子最多的一堆,取剩至数量等于其余石堆的异或和,将总异或和置为零即可;若总异或和为零,无论先手方如何选取,所取的堆石子数必然会从等量于其余石堆的异或和减少,使总异或和不为零。Nim游戏其实原创 2021-01-27 14:01:31 · 480 阅读 · 1 评论 -
【因式分解】莫比乌斯函数
题目是这样子的莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。(据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数)。具体定义如下:如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。如果一个数不包含平方因子,并且有k个不同的质因子,那么miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1)原创 2021-01-27 13:59:56 · 396 阅读 · 0 评论 -
【板子】筛法求素数-线性筛
由于普通的筛法求素数的时候出现了一个数被多次标记的情况,所以效率比较低,我们可以使用线性筛来标记。线性筛中,每个数只被标记一次,时间复杂度为O(N)核心代码是下面这样的:(我下面这串代码求的是2-20000之间的素数)int num[MAXN];int prime[4 * MAXN] = {0};bool vis[4 * MAXN] = {false};int prime_cnt = 0;void Euler(){ for (int i = 2; i <= 20000;原创 2021-01-27 13:58:34 · 114 阅读 · 0 评论 -
【板子】计算一个数的因子的个数
今天做题的时候做了一道这个题,其中需要算一个数的因子的个数.Let’s denote d(n) as the number of divisors of a positive integer n. You are given three integers a, b and c. Your task is to calculate the following sum:Find the sum modulo 1073741824 (2^30).InputThe first line contai原创 2021-01-27 13:57:17 · 374 阅读 · 0 评论 -
cin、cout加速
由于iostream的缓冲区默认是与stdin的同步的,那么这样就导致了cin有很大的开销,因此我们在大量数据读入的时候,需要关闭cin的同步。只需要在main里面加入这句代码ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);...原创 2021-01-27 13:55:32 · 711 阅读 · 0 评论 -
C++运算符优先级
运算符 描述 例子 可重载性 第一级别 :: 作用域解析符 Class::age = 2; 不可重载 第二级别 () 函数调用 isdigit(‘1’) 可重载 () 成员初始化 c_tor(int x, int y) : _x(x), _y(y*10){}; 可重载 [] 数组数据获取 array[4] = 2; 可重载 ->...原创 2021-01-27 13:51:18 · 209 阅读 · 0 评论 -
Trie字典树的巧用
字典树(Trie)是将若干个字符串建成一棵树,一条边有一个字符,从根节点出发的一条树链上的字符排起来就成了一个字符串,需要在单词的终点处打标记。今天做了一道题,和字符串没有半毛钱关系,但是也可以使用字典树的思路来求解。题目是这样子的The XOR Largest Pair题目描述在给定的 N 个整数 A1,A2,…,AN 中选出两个进行异或运算,得到的结果最大是多少?输入格式第一行一个整数 N。第二行 N 个整数 Ai。输出格式一个整数表示答案。样例Input Ou原创 2021-01-16 22:07:05 · 69 阅读 · 0 评论 -
算法与数据结构之有根树的表达
有根树有根树,顾名思义,就是有根节点的树结构。有根树的节点之间存在父子关系,其中,有一个节点,叫做“根节点”。根节点没有父节点。如图所示,1号节点就是根节点,它是唯一一个没有父节点的节点。以节点5为例,它的兄弟节点分别是2、11,父节点为1,子节点分别为6、7、8.我们把没有子节点的节点成为叶节点。有根树中,节点x的子节点数被称为x的度,比如,节点5的度为3.从根节点到节点x的路径长度称为x的深度,另外,节点x到叶节点的最大路径长度为节点x的高。一棵树中,根节点的高度最大,所原创 2020-11-13 15:32:17 · 2669 阅读 · 0 评论 -
算法与数据结构之二叉树
二叉树二叉树就是每个节点至多有两个子节点的树。关于树结构,我们在上一篇《数据结构与算法之有根树的表达》中已经讲过了。所以这里就简单讲讲二叉树怎么表达。二叉树的表达相对比较容易,只要定义好每个节点的父节点、左子节点、右子节点即可。这可以很方便地用结构体来实现。计算二叉树的高怎么计算二叉树的高呢?根据树高的定义,我们知道,每个节点的高是max(左子节点的高+1,右子节点的高+1)。只需要递归地进行计算,就能算出节点的高。这样的算法需要把每个节点都遍历一次,因此复杂度为O(N)题目原创 2020-11-13 15:28:58 · 125 阅读 · 0 评论 -
算法与数据结构之二叉树的遍历
二叉树的遍历方式前序遍历(Preorder)前序遍历就是先访问根节点,再访问左子节点,最后访问右子节点的遍历方式中序遍历(Inorder)中序遍历是先访问左子节点,再访问根节点,最后访问右子节点的遍历方式后序遍历(Postorder)后序遍历是先访问左子节点,再访问右子节点,最后访问根节点的遍历方式二叉树的遍历二叉树的遍历可以通过递归来实现。递归终止的条件是当前节点为空节点,然后返回。前中后序遍历的递归函数不同之处只是输出当前节点的那条语句不同。题目假设二叉树有n个节原创 2020-11-13 15:26:29 · 351 阅读 · 0 评论 -
数据结构与算法之二叉树的重建
二叉树的重建前面几篇笔记讲了二叉树的表达与遍历。那么,有没可能根据二叉树遍历的结果,来重建出一棵二叉树呢?答案是肯定的。给出二叉树前序遍历的结果和中序遍历的结果,我们就能根据这些信息,重新生成二叉树。这个问题相对来说有挑战性,需要花费更长的时间来思考。看下面这棵树:前序遍历结果为pre={1,2,3,4,5,6,7,8,9}中序遍历结果为in={3,2,5,4,6,1,8,7,9}我们可以发现,设前序遍历的当前节点为c,则在中序遍历的结果中,c点左侧和右侧就可以构成左子树和右子.原创 2020-11-13 15:23:21 · 182 阅读 · 0 评论 -
算法与数据结构之二叉搜索树
搜索树与二叉搜索树搜索树是一种可以进行插入、搜索、删除等操作的数据结构。它可以用作字典或者优先级队列。二叉搜索树是最基本的搜索树。它的各个结点都有键值,并且满足以下的条件:设x是二叉搜索树中的结点,y是它的左子树中的结点,那么,y的键值≤x的键值。根据这一特点,我们就能实现一棵二叉搜索树。二叉搜索树的插入根据上述的二叉搜索树的特征,我们就能很方便的实现将元素插入到二叉搜索树中。如果待插入结点的键值小于当前结点的键值,那么就在左子树中递归地执行上述操作,直至待插入结点被插入到二叉树原创 2020-11-13 15:16:20 · 119 阅读 · 0 评论 -
使用归并排序来计算逆序数
计算逆序数在很早之前,我曾经发过一篇文章,讲的是冒泡排序的交换次数就是逆序数。可是,这样计算逆序数的话,时间成本就很高,比较冒泡是时间复杂度为O(N²)的算法呢!那怎么办呢?其实,我们可以使用归并排序的思想来计算逆序数。(以下内容需要先了解归并排序,具体讲解可以看我的这一篇文章:)我们会发现,在进行升序的归并排序时,每一次后方元素移到前面来的移动距离就是本次操作的逆序数。那么我们思考之后可以得出,每一步操作的逆序数就是n1-i具体得看下面这个图:由于每一层递归结束之后,左右两边.原创 2020-11-04 20:50:32 · 415 阅读 · 0 评论 -
算法与数据结构之计数排序
计数排序计数排序是一种稳定的排序算法,它的时间复杂度是O(n+k),其中,数组元素均≥0,且≤k计数排序的主要思想就是①先算出每个元素出现的次数,并且按照元素值为下标,存储在一个临时数组里。②在上面一步的临时数组内,算出≤x的元素个数(注意,数组下标就是x)③根据上面的元素值和临时数组内的计数的关系,计算出结果数组。举个例子,临时数组第3位的值为6,那么就是说,结果数组里,下标为6的元素值是3.这个关系就会有点绕,需要细细理解一下。理解了上面的思想之后,再往下想一步,就会...原创 2020-11-04 18:05:44 · 118 阅读 · 0 评论