[数据结构]——非比较排序—计数排序

2024-05-04 06:52

本文主要是介绍[数据结构]——非比较排序—计数排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该篇文章 所涉及代码收录仓库:登录 - Gitee.com

目录

1.非比较排序——计数排序

2.最终实现

1.解析

2.以int a[] = { 1,3,9,1,5,1,2,3,-5,-5,-2 };为例,手撕分析

3.代码实现

4.计数排序具有以下主要特性:


1.非比较排序——计数排序


思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。

2.最终实现

1.解析

操作步骤:
1. 统计相同元素出现次数
2. 根据统计的结果将序列回收到原来的序列中

  1. 找出最大和最小值: 首先遍历数组 a 一次,找到其中的最大值 max 和最小值 min。这一步是为了确定数组中的数值范围,从而决定后续计数数组 count 的大小。
  2. 创建计数数组: 根据最大值和最小值计算出数值范围 range = max - min + 1,并用 calloc 动态分配一个大小为 range 的整型数组 count。计数数组的每个元素初始化为0,用于记录原数组中每个数值出现的次数。
  3. 统计每个元素的出现次数: 再次遍历原数组 a,对于数组中的每个元素 a[i],计算它与最小值的差值 a[i] - min,并将计数数组中对应索引的位置加1。这样做是因为我们希望 count[0] 存储的是原数组中小于等于 min 的元素数量,count[1] 存储的是原数组中等于 min+1 的元素数量,依此类推,从而避免了因为负数或零而导致的索引错误。
  4. 重排元素: 遍历计数数组 count,对于 count[j] 非零的每个元素,将其对应的数值(即 j + min)放回原数组 a 中,同时减少 count[j] 的计数。这里的循环保证了数值会按照原来的顺序被放置回数组,从而维持了稳定性排序。

2.以int a[] = { 1,3,9,1,5,1,2,3,-5,-5,-2 };为例,手撕分析

3.代码实现

void CountSort(int* a, int n)
{//找出最大和最小元素int min = a[0], max = a[0];for (int i = 1; i < n; i++){if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}int range = max - min + 1;//确定新创建数组的数据个数和原数组大小相同,便于下面计数int* count = (int*)calloc(range, sizeof(int));if (count == NULL){printf("calloc fail\n");return;}// 统计次数for (int i = 0; i < n; i++){count[a[i] - min]++;//min作为偏移量,然后再在对应数组位置++,统计该数字出现的次数}// 排序int i = 0;for (int j = 0; j < range; j++){while (count[j]--){a[i++] = j + min;}}
}

4.计数排序具有以下主要特性:

  1. 非比较排序算法:计数排序不通过元素间的直接比较来进行排序,而是通过计算元素的分布情况来确定它们的位置,这使得它在最好、最坏和平均情况下都有较好的性能表现。

  2. 时间复杂度:计数排序的时间复杂度为O(n+k),其中n是数组长度,k是数组中数据范围(最大值与最小值之差加一)。当k不是很大且远小于n时,计数排序非常高效。

  3. 空间复杂度:计数排序需要额外的计数数组,其空间复杂度为O(k),这使得它在处理大数据范围时可能比较消耗内存。

  4. 稳定性:计数排序是一种稳定的排序算法。因为它在重新排列元素时能够保持相同值的元素原有的相对顺序不变。

  5. 适用范围:最适合于整数或有限范围内的非负整数排序。对于浮点数或负数,虽然理论上可以通过调整使其适用,但实际上并不常见,因为这会增加算法的复杂性。

  6. 局限性:计数排序的局限性主要体现在它对数据类型的限制上,不适合非整数类型的数据排序。此外,当数据范围非常大时,所需的额外空间也会非常大,这在资源受限的环境下可能是个问题。

  7. 预处理要求:在执行排序前需要先遍历一遍数组以确定数据范围,这一步骤虽然简单,但也构成了算法的一部分开销。

综上,计数排序在特定场景下(如数据范围不大、整数类型)是一种快速且高效的排序选择,但其适用场景相对有限,且空间效率较低。

这篇关于[数据结构]——非比较排序—计数排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958576

相关文章

sort常用排序模式---------shell基础篇(三)

sort 排序命令使用 表达式意义sort -c test测试文件“test”是否已经经过排序,一般用处不大sort -k1 test.txt按照第1域对文件test.txt进行排序,日常可以用来对合并的日志文件进行时间排序sort -k1 -m log1.txt log2.txt按照第一域进行排序后合并输出到控制台,建议使用“>>” 将合并内容输出到另一个文件中sort -t / -k3 te

冒泡算法及改进(属于交换排序)

冒泡排序(Bubble Sort)是一种交换排序,快速排序也属于一种交换排序。冒泡排序的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 假设一共共有 n 个数,则会进行 (n-1)趟比较,由1,2......n-1这么多趟,第一趟进行 (n-1)次比较,.......第n-1趟进行1次比较,故有公式:第i趟 +  第i趟的比较次数 = n       时间复杂度为

iOS 数组排序

##1、字母排序 NSArray *arrData = @[@"i",@"b",@"a",@"d",@"e",@"f",@"g",@"h",@"c"];NSArray *sortArray = [arrData sortedArrayUsingSelector:@selector(compare:)];NSLog(@"%@",sortArray); 输出结果: ##2、数字排序

几个人脸库对于面部动作识别的功能比较

经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(AU)代表了面部表情中的一个具体部分的变化。下面是一些动作单位的含义,以及它们在面部表达中

男士内裤有什么牌子比较好?公认男士内裤口碑最好的品牌

现在市面上关于男士内裤有着三角平角两种设计,而在材质方面还有莫代尔、纯棉、冰丝等等各种不同的材质分类,另外还有各种不同的男士内裤品牌。 所以大家在选男士内裤都觉得十分麻烦而且耗费时间,那么今天我就来给大家总结分析一下男士内裤应该怎么选,另外也盘点一下近年比较适合大家选择的五款男士内裤! 以下是我曾测评过的众多男士内裤: 关于男士内裤是否要定期更换? 很多男性对自己穿的内裤不会过于在

【深入理解MySQL的索引数据结构】

文章目录 📕索引底层数据结构与算法📙索引数据结构📘二叉树📘红黑树📘Hash📘B-Tree📘B+Tree 📙表在不同存储引擎的存储结构📘MyISAM存储引擎索引实现📚文件结构📚非聚集索引 📘InnoDB存储引擎索引实现📚文件结构📚聚集索引 📙为什么DBA总推荐使用整型自增主键做索引📙为什么非主键索引结构叶子节点存储的是主键值?📙MySQL最左前缀优化原则是怎

Lintcode 合并两个排序的链表

将两个排序链表合并为一个新的排序链表 样例 给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。 递归实现: """Definition of ListNodeclass ListNode(object):def __init__(self, val, next=None):self.val = valself.n

【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置

本节博客主要是通过“在排序数组中查找元素的第一个和最后一个位置”总结关于二分算法的左右界代码模板,有需要借鉴即可。 目录 1.题目2.二分边界算法2.1查找区间左端点2.1.1循环条件2.1.2求中点的操作2.1.3总结 2.2查找区间右端点2.1.1循环条件2.1.2求中点的操作2.1.3总结 2.3总结 3.参考解题代码4.模板总结5.总结 1.题目 题目链接:LIN

【董晓算法】竞赛常用知识点之数据结构1

前言: 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com)  动态规划系列(还没学完) 【董晓算法】动态规划之线性DP问题-CSDN博客 【董晓算法】动态规划之背包DP问题(2024.5.11)-CSDN博客 【董晓算法】动态规划之背包DP与树形DP-CSDN博客 字符串系列 【董晓算法】竞赛常用知识之字符

【高阶数据结构(四)】图的最短路径问题

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多数据结构   🔝🔝 高阶数据结构 1. 前言2. 单源最短路径问题3. dijkstra算法讲解4. bellman-Ford算法讲解5. 多源最短路径问题6. Floyd-Warshall算法讲解7. 总结