基本排序算法 之八 ——计数排序

数据结构笔记——向量、列表、栈 一、向量 向量结构中,各数据项的物理存放位置与逻辑次序完全对应,故可通过秩直接访问对应的元素,此即所谓“循秩访问”,各元素物理地址连续。 1.1 排序与下界 比较树 1、每一内部结点各对应于一次比对操作; 2、内部节点的左右分支,分别对应于在两种比对结果(是否等重)下的执行方向; 3、叶节点(或等效地,根到叶节点的路径)对应于算法某次执行的完整过程及输出; 4、反过来,算法的每一运行过程都对... 阅读详情

 


基本排序算法总结与对比 之八  ——计数排序 


1、计数排序 

       前面介绍的七种排序算法都属于 基于比较的排序算法(CBA式算法)。这类算法的共同点就是:时间复杂度最优只能到O(nlogn)。接下来包括这次介绍的三种算法都属于非比较算法,其时间复杂度平均情况下均为O(k·n),k为常数。

       计数排序 又叫 鸽巢排序。就是用一个与 数列最大数数值 相等长度 的数组记录每个元素出现的次数。然后遍历记录数组,按照记录的个数打印下标。这种排序在数值小的时候特别快。

       但是,也特别不实用。一是 最大数太大就得开一个特大的数组;二是 数组下标只能为非负整数。

//找出数列最大数
int findMax(int arr[], int lo, int hi)
{
    int max = *(arr + lo);
    while(++lo < hi)
    {
        if (*(arr + lo) > max) max = *(arr + lo);
    }
    return max; 
}

void countSort(int arr[], int lo, int hi)
{
    int maxNum = findMax(arr, lo, hi);
    size_t *count = new size_t[maxNum + 1];    //建一个能装maxNum + 1个数的数组
    for(int j = 0; j < maxNum + 1; j++) count[j] = 0;    //置零
    
    for(int i = lo; i < hi; i++)
    {
        count[*(arr + i)]++;
    }
    
    int *p = arr;
    for(int j = 0; j < maxNum + 1; j++)
    {
        while(count[j]--)
        {
            *p++ = j;
        }
    }
}

       显然,该算法时间复杂度为O(2n),而且是稳定的。

       关于计数排序有个 特殊的 版本叫 位图排序。它只适用于无重复的非负整数数列。它的原理是开辟一段内存,用内存里的0,1表示 对应位数数值 的有无。这样可以大量节省内存空间,提高运算速度。 同样,他也特别不实用!位图排序相关内容将不再介绍。

C++排序算法之计数排序 计数排序 像快排、堆排、归并等排序算法都是基于比较的排序算法,时间复杂度最好情况也只能降到O(nlogn)。 计数排序是一种线性排序算法,不需要进行比较,时间复杂度为O(n)。(注意是计数排序不是基数排序,两者不同) 基本思想是:对于每个元素x,找出比x小的数的个数,从而确定x在排好序的数组中的位置。此算法需要辅助数组,是以空间换时间。 举例说明: 原始数组:arr 阅读详情

相关推荐

经典排序—计数排序算法

一、前言 我们知道归并排序是一种高效的排序算法,在任何情况下时间复杂度都为O(nlogn)。但是,它需要用额外的内存空间来暂时储存归并过程中的元素,因此我们可以认为归并排序是以牺牲一部分内存空间为代价来获得时间的高效性。 相反,如果内存空间有限,我们就必须以牺牲时间为代价来保证空间不被过度使用。像上面所说的那样,在设计一个算法的过程中同时考虑时间复杂度和空间复杂度,并且在这两者中找到一个平衡点的过程我们把它称作时空权衡(time and space trade-off)。 在通常情况下,我

m0_58683072的博客 1413

论文笔记:Integrating Classification and Association Rule Mining (即,CBA算法介绍)

1998 KDD 0 摘要 分类规则挖掘旨在发现数据库中的一小组规则,形成一个准确的分类器。 关联规则挖掘发现数据库中存在的所有满足最小支持度和最小置信度约束的规则。 对于关联规则挖掘,发现的目标不是预先确定的,而对于分类规则挖掘,则只有一个预先确定的目标。 在本文中,我们建议整合这两种挖掘技术。 集成是通过专注于挖掘关联规则的特殊子集来完成的,称为类关联规则 (CAR)。 还给出了一种基于发现的 CAR 集构建分类器的有效算法。 实验结果表明,以这...

qq_40206371的博客 2329

排序算法——计数排序

之前看的都是比较排序算法,通过两个数大小的比较来进行比较。计数排序是一种线性排序算法,不用进行比较。基本思想是对于每个元素x,找出比x小的数的个数,从而确定x在排好序的数组中的位置。算法导论第三版109页,讲解非常清楚。这里把其中的一个图贴上来,便于理解 图中,数组A是待排序的数组,C是用来临时存放信息的数组,B是最终排好序的数组。对于A中的每一个元素,我们将其元素作为C数组的下

点点滴滴 4207

CBA算法---基于关联规则进行分类的算法 CBA算法---基于关联规则进行分类的算法CBA算法---基于关联规则进行分类的算法...

关闭 CBA算法---基于关联规则进行分类的算法 标签:机器学习数据挖掘算法数据 2015-02-14 19:02823人阅读评论(0)收藏举报 分类: 算法(44)数据挖掘(32)机器学习(30) 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] ...

小飞侠的博客 806

《通信工程施工与管理》

制作馈线接头必须使用专用的工具,专用工具包括:馈线切割刀、馈线安全刀、小金属丝毛刷、固定尺寸或大号活动扳手、小号扁锉刀、细齿小手锯、接头扩孔器、3M防水胶或防水接头盒;如图所示,详情如表所示。

2302_78710464的博客 1653

八大排序算法——(万字图文详解)

本篇博客将对“直接插入排序”、“希尔排序”、“直接选择排序”、“堆排序”、“冒泡排序”、“快速排序”、“归并排序”、“计数排序”进行详细的解析(算法逻辑、具体实现过程、时间复杂度、稳定性),并附以图片帮助大家更好地理解算法逻辑以及实现每个排序的参考代码。

Forward♞的博客 8076

二路归并 c++实现

二路归并 时间复杂度。CBA(基于比较)的排序算法的最好的复杂度是o(nlogn),最坏情况o(n^2) 归并排序的算法即使在最坏情况下复杂度都是O(nlogn) 归并算法是分治策略的应用 1)将待排序序列一分为二,时间o(1) 2)对于划分的子序列,分别递归排序 ----分 2*o(n/2) 3)当子序列分别有序,合并有序子序列 ---治 o(n) T(n) = 2*T(n / 2) + o(n) 这个递推式的结果可以数学方面计算,最终是o(nlogn) [4, 8,68, 8, 32, 7,

zishuijing_dd的博客 504

科研作图不发愁:手把手教你用PyMOL给蛋白-DNA互作图‘美颜’(附完整配色与标注方案)

本文详细介绍了如何使用PyMOL对蛋白-DNA互作结构图进行专业美化,包括从PDB文件加载、结构展示与标注、互作位点突出显示到高质量渲染输出的完整流程。通过具体案例(PDB ID:8SSS)演示了锌指结构域区分、关键残基标注和互作距离测量等实用技巧,帮助科研人员制作可直接用于期刊投稿的高质量示意图。

weixin_42523792的博客 552

【数据结构笔记】排序Sorting

下设升序排序。

Resurgence03的博客 1141

在 Windows 上使用 Anaconda 创建 配置 YOLOv8虚拟环境,并更改 pip 源以及以 可编辑模式 安装ultralytics

前往 NVIDIA cuDNN 下载页面,下载与您安装的 CUDA 版本匹配的 cuDNN 版本。:根据您的系统和 CUDA 版本,选择适当的 whl 文件。如下12.7,表示最高可装12.7版本CUDA,与上图中的支持的最高cuda版本一致。,无需重新安装,从而大幅提升开发效率,适用于项目开发、调试或依赖本地未发布的版本时使用,但需确保当前目录包含。:访问 NVIDIA 官方网站,下载与您的显卡和操作系统兼容的 CUDA 版本。首先,确保NVIDIA 显卡支持 CUDA,并安装相应版本的驱动程序。

weixin_44115575的博客 1893

DDR4技术原理详解

DDR4是DDR4-SDRAM的简写,即第4代DDR-SDRAM,DDR-SDRAM全称Double Date Rate Synchronous Dynamic Random Access Memory。本文重点解析DDR4技术规范及其背后的电子电路原理,以及编程使用DDR4过程中需要注意的性能事项。

ctbinzi的专栏 1万+

计数排序算法

一文速学计数排序

chenchenchencl的博客 1801

ResNet改进(20):融合Swin Transformer与ResNet

这种混合架构的设计理念是:在保留CNN强大局部特征提取能力的同时,引入Transformer的全局建模优势。我们实现的模型在ResNet18的基础上嵌入了一个简化版的Swin Transformer Block,旨在探索两种范式结合的可能性。通过在ResNet早期阶段引入Transformer模块,我们既保留了CNN强大的局部特征提取能力,又获得了Transformer的全局建模优势。本文提出的ResNet与Swin Transformer混合架构,探索了CNN与Transformer结合的可能性。

2401_82355416的博客 859

【排序算法】—— 计数排序

排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。

2302_80243065的博客 1694

ORB-SLAM3编程实践指南

它基于特征点的立体视觉和视觉惯性里程计技术,能够在没有先验知识的情况下,从单目、双目或RGB-D摄像头的输入中实时构建稠密三维地图,并实现相机的定位。通过正确配置环境、准备数据集和运行ORB-SLAM3,您可以实现高效的视觉SLAM系统,并获取相机在三维空间中的位姿。其中,[path_to_vocabulary]是ORB-SLAM3的词汇文件路径,[path_to_settings]是相机参数配置文件路径,[path_to_sequence]是输入图像的路径。运行ORB-SLAM3。

ByteNinja的博客 551

数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句

某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建

qq_44242804的博客 2761

【十大排序算法】(八)计数排序算法

一、基本思想 计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 二、算法分析 1、算法描述 找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加); 反向填充目标数组:将...

riemann_的博客 766

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

算法设计与分析——排序算法(八):计数排序

计数排序假设nnn个输入元素中的每一个都是在000到kkk区间内的一个整数,其中kkk为某个整数。当k=O(n)k=O(n)k=O(n)时,排序的运行时间为Θ(n)\Theta(n)Θ(n)。 计数排序的基本思想是:对每一个输入元素xxx,确定小于xxx的元素个数。利用这一信息,就可以直接把xxx放到它在输出数组中的位置上了。例如,如果有17个元素小于xxx,则xxx就应该在第18个输出位置上。当有几个元素相同时,这一方案要略做修改。因为不能把它们放在同一个输出位置上。 在计数排序算法的代码中,假设输入是一

冯·诺依曼 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【十大排序算法】计数排序

数字在轻舞纷飞中,依次排列,如星辰般闪耀。

DC1020的博客 1152

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

十大排序算法——计数排序

计数排序一. 计数排序介绍二. 计数排序基础版三. 计数排序改进版四. 优化最终版本_空间节省 一. 计数排序介绍 计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。 算法分析 当输入的元素是n 个0到k之间的整数时,它的运行时间是 O(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。 由于用来计数的数组C的长度取

8434

排序算法 -计数排序

计数排序

shiyue 1466

排序算法之计数排序

计数排序(Counting sort)是一种稳定的线性时间排序算法。该算法于1954年由[哈罗德·H·西华德]提出。计数排序使用一个额外的数组𝐶,其中第i个元素是待排序数组𝐴中值等于𝑖的元素的个数。然后根据数组𝐶来将𝐴中的元素排到正确的位置。

rd_w_csdn的博客 1652

必学排序算法——计数排序

计数排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解计数排序算法。计数排序(Counting Sort)是一种非比较型整数排序算法,适用于一定范围内的整数排序。其基本思想是通过计数来确定每个值在数组中出现的次数,然后根据这些计数来确定每个元素在排序后数组中的位置。计数排序的时间复杂度为 O(n + k),其中 n 是待排序数组的长度,k 是待排序数组中的最大值与最小值之差,

ycs66的博客 1349

计数排序算法——C++

​计数排序是时间复杂度为O(n + m)的算法,空间复杂度为O(n + m);算法思想跟散列表哈希hash有些类似,主要是利用一段有序数组计算对应元素的下表个数,然后依次输出有数组元素进行排列。基本计数排序是不稳定算法,但是优化后计数排序是稳定算法。本文主要讲解基本计数排序和优化后计数排序。 使用条件:数组必须是整数或者能全部映射为整数,数组所有元素必须在有限较集中范围; 一、具体实现步骤 1.计算原始数组的最大值max和最小值min范围,然后创建一个长度为max--min+1的排序数组sortAr

净无邪博客 3706

经典排序算法之【计数排序】

       互联网行业的小白,写博客的目的是为了记录自己的学习过程、对自己学习中所犯的错误做一个总结。由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教! 这里写目录标题1. 原理2. 步骤3. 演示4. 模板5. 分析 1. 原理 计数排序是一个非基于比较的排序算法,它的优势在于在对一定范围内的整数排序时,它的复杂度为O(n+k)Ο(n+k)O(n+k)(k是整数的范围),快于任何比较排序算法。其思想类似于哈.

鸪鹑菌的个人博客 754
上一篇: 基本排序算法 之七 ——堆排序
下一篇: 基本排序算法 之九 ——桶排序
晨晚_
博客等级 码龄9年 10粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值