首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【数据结构】八大排序之计数排序算法

算法动图演示如下: 计数排序的实现思路: 统计每个数据出现的次数 按序输出 虽然计数排序实现思路比较简单,但我们还是有一些细节需要注意: 绝对映射和相对映射: 绝对映射:如下图,数据的数值和数组下标是一一对应的...,这种计数方式叫做绝对映射对映射的缺点:开辟数组占用空间大,不能够排负数 相对映射:如下图,数据在数组中是按照数值的相对大小来映射的,这种计数方式叫做相对映射....相对映射较好的解决了绝对映射的缺点,但当遇到待排数据分布较为分散且跨度较大时,就不太适合使用计数排序进行排序了....二.计数排序代码实现 算法实现步骤:(以升序为例) 遍历待排数组,找出数组中的最大max和最小min. 开辟大小为max-min+1大小的数组用以计数. 遍历数组计数....i + min; } } free(countA); } 三.计数排序复杂度分析 时间复杂度 计数排序的时间复杂度主要取决于两部分,一是前期遍历数组找出最大和最小,这里的时间复杂度为n,

7210

【数据结构】八大经典排序(两万字大总结)

;而映射又分为绝对映射和相对映射,相对映射是对绝对映射的优化。...相对映射 在学习了绝对映射后,我们发现绝对映射存在两个缺陷: 当数据很大时时,空间消耗过大;比如我们要对数组 a = { 5001, 4989, 5010, 4550} 进行计数排序,我们需要开辟一个大小为...基于绝对映射存在的这些缺陷,我们设计出了相对映射来对其进行一定程度上的优化;绝对映射的基本思路是: 我们不再根据数组的最大元素来开辟空间,而是根据数组中最大元素与最小元素的差值来开辟空间;比如上面的数组...a 中最大元素为5010,最小元素为4550,那么我们就只需要开辟 5010-4550+1 即61个整形的空间; 相应的,我们在进行映射时也不再直接映射元素到对应的新数组下标中,而是让元素元素减去最小之后再进行映射...8.2 代码实现 // 计数排序 void CountSort(int* a, int n) { //找出数组中的最大和最小,为相对映射做准备 int i = 0; int min = a[0

53900
您找到你想要的搜索结果了吗?
是的
没有找到

排序算法】 计数排序(非比较排序)详解!了解哈希思想!

前言 什么是计数排序?计数排序的思想是什么?它是如何实现的? 本文会对计数排序进行由浅入深的探究,让你彻底掌握计数排序! ️计数排序的概念 ☁️什么是计数排序? ​...☁️计数排序思想 计数排序是一种小众的排序,它适合于数据密集的场景,最大数的数值来开空间。...⭐绝对映射 假设现有一组数据,最大的数据是1000,那么便会开一千个大小的空间,这种属于绝对映射,在极端的场景下,极易造成空间上的浪费,比如现在有5,99,88,1000,8888,452,635,82,777,555...⭐相对映射 因此绝大多数情况下,都会使用对映射。 具体的步骤如下: 找出待排序数组中的最大和最小,并创建一个计数数组,长度为最大和最小之差加1。...重构排序数组: 使用两个循环,首先遍历计数数组 count,然后在内部循环中,根据计数数组中的,将相应数量的整数值还原到原始输入数组 a。这将完成排序过程。 ️

10210

Java从入门到精通八(Java数据结构--Map集合)

很显著的特点就是Collection是单列的,只能直接存放,在Map这个集合上面可以有key(键)和value() API明确说明了这个key和value的关系,按照映射来说其实就是一种单的关系。...Collection(由此类的所有 collection 视图方法所返回)的 iterator 方法返回的迭代都是快速失败 的:在迭代创建之后,如果从结构上对映射进行修改,除非通过迭代自身的 remove...该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 在线程同步问题上 注意,此实现不是同步的。...然后追溯这个比较接口 其实通过了解可以了解这个接口的方法 需要注意的是,如果自定义构造的话,一般需要自己进行重写这个方法。 下面演示一下进行按照进行排序。...其实自己会想到,很多时候我们会还是对对象的属性进行比较。单列的比较好像比双列的比较容易一点。没有那么难理解。现在双列的比较也理解了好多。希望记录下来。以后自己该补充就补充。

70610

【离散数学】单、满与双

本文目录 1、什么是映射? 2、映射的分类 2.1 单 2.2 满 2.3 双 2.4 既非单也非满,但为映射 3、你掌握了吗? 4、心得 1、什么是映射?...这是用很通俗的语言解释定义的映射,而相信大家也都在高中数学必修1里面学过,对映射这个概念想必也都不陌生吧! 从这个定义中,你能get到什么信息呢?...只有if(判定的结果==true)时,我们才可以进行下一步的区分判断;else,它连映射都不是,还判断个什么呢?...写出两个集合之间是否存在映射关系,如果存在,写出是哪一种映射关系。 要求:从“单而非满”、“满而非单”、“双”、“不是单也不是满”、“不是映射”中选词作答。 答案将会在评论区公布。...因为它的集合与这个表中记录的集合呈双关系。” 而不会是这样的: “emmm……啊??主键,我觉得大概可能是这个属性啊。为什么呢?因为……我也说不上来,大概,就是因为那个,它是唯一的。

6K30

JAVA常用API整理

一种可以记住键/项添加次序的映射表 WeakHashMap 一种其无用武之地后可以被垃圾回收期回收的映射表 IdentityHashMap 一种用==而不是用equals比较键值的映射表 1、List...在实例化TreeSet时,我们可以给TreeSet指定一个比较Comparator来指定树形集中的元素顺序。树形集中提供了很多便捷的方法。...java.util.ProrityQueue 优先级队列中的元素可以任意顺序插入,却总是按照排序的顺序进行检索。优先级队列由堆实现。...堆是一个可以自我调整的二叉树,对树执行添加和删除操作,可以让最小元素移动到根(最小堆),而不必花费时间对元素进行排序 4、Map接口 Map,图,是一种存储键值对映射的容器类,在Map中键可以是任意类型的对象...,也可以它们最后一次被访问的顺序排序

2K41

【C语言数据结构】排序(归并排序|计数排序|排序算法复杂度)

NULL) { perror("malloc fail"); return; } _MergeSort(a, 0, n - 1, tmp); free(tmp); } 分析:因为是使用递归实现...一趟归并结束后,gap变为2倍,进行后面的归并,直到gap>=n就停止。...计数排序(非比较排序) 代码实现 void CountSort(int* a, int n) { int min = a[0], max = a[0]; for (int i = 1; i < n;...但是,如果要排序的数是从一千多开始的,这样前面的空间就全部浪费了。所以我们采用相对映射的方法。即用待排序的数中,最大的数-最小的数+1就可以得到范围,从而减少空间浪费。...接着用原数组的数减去最小,将该作为count数组的下标,即相对映射。最后进行排序,记得加回最小min,这样数据才不会被改变。

10410

CycleGAN论文的阅读与翻译,无监督风格迁移、对抗损失

从数学上讲,如果我们有一个翻译 G : X → Y 与另一个翻译 F : Y → X ,那么 G 与 F 彼此是相反的,这一对映射是双 (bijections) 。...全卷积从一幅图片 预测出整张图片的语义标签地图,然后使用标准的语义分割模型,各自生成图片与输入图片 的标签地图,然后使用它们用来描述的标准语义进行比较。...将图像比例缩放到 360 像素宽。使用重量 0.5λ的同一性映射损失。智能手机和 DSLR 数据集的训练集大小分别为 1813 和 3326。 7.2。...文章第一节的介绍部分,提到:从数学上讲,如果我们有一个翻译 G : X → Y 与另一个翻译 F : Y → X ,那么 G 与 F 彼此是相反的,这一对映射是双 (bijections) 。...根据文章中提到的:使用 cycleGAN 可以进行 野马 ⇋斑马 的转换,但是无法转化形态差异比较大的 猫 ⇋ 狗。

82730

java学习与应用(3.2)--数据结构相关

可以使用迭代,get与for等方法进行遍历。 ArrayList数组,使用多线程技术,在增删过程反复开辟空间和赋值,导致增删慢。...Collections工具类 Collections的工具类,包含静态方法如:add添加元素,shuffle打乱元素,addAll添加多个元素,sort默认规则排序(自定义类需要实现接口Comparable...,重写方法compareTo) sort排序使用Comparator匿名类重写compare方法作为参数进行排序)其中自定义的排序方法可以组合进行多个关键字排序 Map接口 Map接口,包含K和V两个泛型...keySet方法,返回的key会放到Set集合中,使用迭代或增强for进行遍历key,键找进行遍历。...Map接口的实现集合被创建后,为每个键值对其内部的创建了Entry对象(Map.Entry),多个Entry用于记录键值对映射关系的集合(使用entrySet取出)。

1.1K10

华为三面:说说List、Map和Set有什么区别!

Java提供了高性能的集合框架,主要包括两种容器类型:一种是集合(Collection),存储一个元素集合;另一种是图(Map),存储键/对映射。 [?...Map 接口是一个独立的数据结构,同时依赖于Collection接口,Collection接口又依赖于迭代Iterator接口,这样所有的集合类型都可以使用统一的方式从中取出元素,Redis实战学习笔记共享...如果要对 ArrayList 按照元素的进行排序,可以调用 Collection.sort() 方法,并提供一个 Comparator 比较。...TreeSet 自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口。 Map接口类型 与List、Set不同,Map类型不是Collection接口的继承。...适用于自然顺序或自定义顺序遍历键。 HashMap通常比TreeMap快一点,树和哈希表的数据结构使然,建议一般场合多使用HashMap,在需要排序的场合才用TreeMap。

61300

一种强化的基于局部直方图裁剪均衡化的对比度调节算法。

,还增加了各通道直方图与亮度通道直方图的信息合成,然后对合成后的直方图进行直方图裁剪和均衡化的,获取各子块新的映射直方图,为了避免新的映射表中的数据有较大的奇点或噪音,对映射表的数据进行多点取样,然后使用样条插算法对取样点进行...最后使用类似CLAHE算法中的双线性插对每个子块之间的映射进行插值得到新的像素。...本方法计算量小,速度很快,对映射进行平滑插或高斯模糊能有效的抑制对比度调整时产生的噪声,防止了信息的过度放大造成图片失真,是一种高效并且效果突出的对比度增强算法。...对于Bins =256的图像,K建议可取32左右。     或者另外一种处理方式就是对映射进行一维方向的均值或者高斯平滑,平滑窗口可选WindowSize = 7左右。   ...8、按照CLAHE算法的过程对每个小块进行双线性插值得到最终的增强效果,当然对第一行、第一列、最后一行、最后一列的子块靠近图像边缘的那一半都只使用映射表单个方向的线性插,而这些子块的其他部分以及其他子块均使用映射表双线性插获得最终结果

1.7K92

219个opencv常用函数汇总

; 67、cvOrs:在数组与标量之间进行位或操作; 68、cvReduce:通过给定的操作符将二维数组简为向量; 69、cvRepeat:以平铺的方式进行数组复制; 70、cvSet:用给定初始化数组...; 80、cvSVBkSb:奇异回代计算; 81、cvTrace:计算矩阵迹; 82、cvTranspose:矩阵的转置运算; 83、cvXor:对两个数组进行位异或操作; 84、cvXorS:在数组和标量之间进行位异或操作...,校正标定图像,图像插; 156、cvWarpAffine:稠密仿变换; 157、cvGetQuadrangleSubPix:仿变换; 158、cvGetAffineTransform:仿映射矩阵的计算...; 159、cvCloneImage:将整个IplImage结构复制到新的IplImage中; 160、cv2DRotationMatrix:仿映射矩阵的计算; 161、cvTransform:稀疏仿变换...:稀疏透视变换; 165、cvCartToPolar:将数值从笛卡尔空间到极坐标(极性空间)进行映射; 166、cvPolarToCart:将数值从极性空间到笛卡尔空间进行映射; 167、cvLogPolar

3.2K10

排序算法(九):桶排序

排序则是提供了额外的操作空间,在额外空间上对桶进行排序,避免了构成桶过程的元素比较和交换操作,同时可以自主选择恰当的排序算法对桶进行排序。...映射规则需要根据待排序集合的元素分布特性进行选择,若规则设计的过于模糊、宽泛,则可能导致待排序集合中所有元素全部映射到一个桶上,则桶排序比较性质排序算法演变。...若映射规则设计的过于具体、严苛,则可能导致待排序集合中每一个元素映射到一个桶上,则桶排序向计数排序方式演化。...排序算法的选择,从待排序集合中元素映射到各个桶上的过程,并不存在元素的比较和交换操作,在对各个桶中元素进行排序时,可以自主选择合适的排序算法,桶排序算法的复杂度和稳定性,都根据选择的排序算法不同而不同。...由桶排序的过程可知,当待排序集合中存在元素相差较大时,对映射规则的选择是一个挑战,可能导致元素集中分布在某一个桶中或者绝大多数桶是空桶的现象,对算法的时间复杂度或空间复杂度有较大影响,所以同计数排序一样

49220

离散 单

+y2 条件:|X|<=|Y| 2.满:对于每一个y都有x与之对应 条件:|Y|<=|X| 3.双:既是单又是满 条件:|X|=|Y| 代码实现 通过map函数建立映射 1.单:...一对应,每一个都不能有重复,所以通过迭代的++来输入不同的键值对。...} if(size1==s.size()) bIsInjection= true; return bIsInjection; } set函数,是一个集合,他的作用是对于插入的数据进行排序以及去重...,所以我们把Y插入到s中观察是否有相同的数据,只需要判断键值对的数量以及集合的长度是否相等即可 2.验证满 bool ValidateSurjection(vector src, vector...再遍历Y,看Y中是否有相同,有就不是双 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132811.html原文链接:https://javaforall.cn

1.8K20

Golang数据类型之Map

映射的key只能为可使用==运算符的类型(字符串、数字、布尔、数组),value可以为任意类型 map的设计也被称为The dictionary problem,它的任务是设计一种数据结构用来维护一个集合的数据...len函数获取映射元素的数量 4.2 访问 当访问key存在与映射时则返回对应的,否则返回类型的零 4.3 判断key是否存在 通过key访问元素时可接收两个,第一个为value,第二个为bool...类型表示元 素是否存在,若存在为true,否则为false 4.4 修改和增加 使用key对映射赋值时当key存在则修改key对应的value,若key不存在则增加 key和value 4.5 删除...使用delete函数删除映射中已经存在的key 4.6 遍历 可通过for-range对映射中个元素进行遍历,range返回两个元素分别为映射的key和 value 上述操作示例: // 增删改查 /..., 200) // 定义切片 for key := range scoreMap { // 把key添加到切片中 keys = append(keys, key) } // 2、对切片进行排序

1.7K20

【009期】JavaSE面试题(九):集合之Set

当向HashSet中添加元素的时候,首先计算元素的hashcode,然后通过扰动计算和位与的方式计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去;如果不为空,则用equals方法比较元素是否相等...TreeMap是key排序的,元素在插入TreeSet时compareTo()方法要被调用,所以TreeSet中的元素要实现Comparable接口。...TreeSet要求存放的对象所属的类必须是实现Comparable接口,该接口提供了比较元素的compareTo方法,当插入元素时会调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必须实现...Comparable接口,从而根据键对元素进行排序。...Collections工具类的sort方法有两种重载的形式, 第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较, 第二种不强制性的要求容器中的元素必须可比较但是要求第二个参数

44830

Java中的集合-您必须知道的13件事

队列通常但不一定以FIFO(先进先出)的方式对元素进行排序。优先队列除外,它们根据提供的比较或元素的自然顺序对元素进行排序。...3.10)SortedMap 接口 以升序顺序维护其映射的Map。这是SortedSet的Map模拟。排序后的Map使用键/对的自然排序集合,例如字典和电话簿。 4....根据映射键的自然顺序或在映射创建时提供的比较对映射进行排序,具体而言所使用的构造函数。 此实现为containsKey,get,put和remove操作提供了保证的log(n)时间成本。...请注意,TreeMap维护的排序(与任何排序映射相同)以及是否提供显式比较必须与equals一致,杀死此排序映射正确实现Map连接。...第二种形式除列表和搜索键外还采用比较,并根据指定的比较将列表升序排序排序算法可用于在调用binarySearch之前对List进行排序

86440

用 Kotlin 的函数式编程 替代 GOF 设计模式用 Kotlin 的函数式编程 替代 GOF 设计模式函数式编程(FP)《Kotlin极简教程》正式上架:

OOP vs FP (2).png 函数与映射 一切皆是映射。函数式编程的代码主要就是“对映射的描述”。我们说组合是编程的本质,其实,组合就是建立映射关系。...态指的是一种映射关系,简单理解,态的作用就是把一个对象 A 里的 a 映射为 另一个对象 B 里的 b = f(a),这就是映射的概念。...组合操作符 组合操作符,用点(.)表示,用于将态射进行组合。组合操作符的作用是将两个态射进行组合,例如,假设存在态 f: A -> B, g: B -> C, 则 g.f : A -> C....其实,从映射的角度看,就是二阶映射。对[a, ab, abc] 中每个元素 x 先映射成长度g(x) = 1, 2, 3 , 再进行第二次映射:f(g(x)) %2 != 0 , 长度是奇数?...返回是true的被过滤出来。 有了高阶函数,我们可以用优雅的方式进行模块化编程。 另外,高阶函数满足结合律: ?

1.1K50
领券