算法导论之八计数排序

算法导论 — 8.2 计数排序 笔记 假设输入的nnn个元素中的每一个都是在000 ~ kkk内的一个整数。kkk表示了输入元素所处的范围。一般在kkk远小于nnn时,可以采用计数排序算法。   计数排序的基本思想是:对每一个输入元素xxx,确定小于xxx的元素个数。利用这一信息,可以直接把xxx放到正确的位置。例如,如果有171717个元素小于xxx,则x就应该放在第181818个位置上。   以下为计数排序的伪代码。假设输入... 阅读详情

1.        定理1:在最坏情况下,任何比较排序算法都需要做

定理2:堆排序和归并排序都是渐近最优的比较排序算法。

2.        计数排序的思想是:对每一个输入元素x,确定小于x的个数,前提条件时假设n个输入元素中的每一个都是在0到k区间内的一个整数。

3.        计数排序算法的输入是数组A[1..n],Alength=n,数组B[1..n]存放排序的输出,C[0..k]提供临时存储空间

COUNT-SORT(A,B,k)

         //初始化操作

         let C[0..k]be a new array

         for i = 0 tok

                   C[i]= 0

         //C[i]中保存的是等于i的元素的个数

         for j = 1 toA.length

                   C[A[j]]= C[A[j]] + 1

         //通过相加,确定对每一个i=0,…,k,有多少输入元素是小于等于i的

         for i = 1 tok

                   C[i]= C[i] + C[i-1]

         for j =A.length downto 1

                   B[C[A[j]]]= A[j]

                   C[A[j]]= C[A[j]] – 1

最后将每个元素A[j]放到它在输出数组B中的正确位置。如果n个元素互异,对每一个A[j]值来说,C[A[j]]就是A[j]在输出数组中的最终正确位置,因为所有的元素可能并不互异,所以每将一个值A[j]放入数组B中以后,都要讲C[A[j]]的值减1.这样当下一个值等于A[j]的输入元素时,该元素可直接放到输出数组A[j]的前一个位置上。

4.        当k为O(n)时,计数排序的运行时间为 ,计数排序的重要性质就是它是稳定的,即具有相同值得元素在输出数组中的相对次序与它们在输入数组中的相对次序相同。

5.        计数排序的程序代码如下:

#include<stdio.h>

#include<stdlib.h>

 

intCountSort(int *pData,int nLen)

{

         int *pCount=NULL;  //保存记录数据的指针

         pCount=(int*)malloc(sizeof(int)*nLen);  //申请保存的空间

 

         //初始化计数为0

         for (int i=0;i<nLen;i++)

         {

                   pCount[i]=0;

         }

 

         //统计数组中相同元素的个数

         for (int i=0;i<nLen;i++)

         {

                   pCount[pData[i]]++;

         }

 

         //确定不比该位置大的数据个数

         for (int i=1;i<nLen;i++)

         {

                   pCount[i]+=pCount[i-1];

         }

 

         int *pSort=NULL;     //保存排序结果的指针

         pSort=(int *)malloc(sizeof(int)*nLen);

 

         for (int i=nLen-1;i>=0;i--)

         {

                   pSort[pCount[pData[i]]-1]=pData[i];

                   --pCount[pData[i]];

         }

 

         for (int i=0;i<nLen;i++)

         {

                   pData[i]=pSort[i];

         }

 

         free(pCount);

         free(pSort);

         return 1;

}

intmain()

{

         int nData[]={8,6,3,6,5,8,3,5,1,0};

         CountSort(nData,10);

         for (int i=0;i<10;i++)

         {

                   printf("%d",nData[i]);

         }

         printf("\n");

         return 0;

}

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

相关推荐

笔记: 排序算法——计数排序(C++实现)

计数排序 计数排序伪代码 C++实现 测试 基数排序 基数排序伪代码 C++实现 测试

littleboy__的博客 2068

【数据结构】八大排序——选择排序

八大排序中其他排序 直接插入排序 希尔排序 文章目录前言选择排序原理代码实现 前言 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 选择排序原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小

weixin_56499830的博客 1328

算法导论第八章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

O(n)时间复杂度排序算法(桶、计数、基数排序)总结

概述 桶、计数、基数排序算法中,除了桶排序在桶粒度大于1时要通过比较排序外,其他两种排序都不需要使用比较就能使数列完成排序,这也是为什么时间复杂度可以达到线性O(n)的原因。 桶排序 桶排序的求解思路为找出数列中最小和最大值,按照同等大小的范围从最小到最大值闭区间的数值范围内垂直切分为一定个数的子区间,然后把数列内的值依次取出放到合适的子区间内,各子区间再分别对各自区间内的数值进行排序,最后拼接所有子区间的数值就完成了排序。 假设桶排序内各个子区间内的排序算法使用的是快速排序,快速排序的时间复杂度为

Fanrncho的博客 1875

各种AI的调试日记——辅助工作篇

记录使用各种AI(语言大模型)的心得和总结

m0_73056986的博客 1391

Blazor Session设置

微软官方封装了一些浏览器的操作,其中就有Session的操作的封装ProtectedSessionStorage 微软文档因为我们知道,依赖注入的生命周期是Singleton程序Scoped网页:刷新,url直接跳转都会重置。Transient路由C# Blazor 学习笔记(10):依赖注入但是没有一个和浏览器绑定的生命周期。即浏览器关闭才会退出。这个是后端无法获取的,因为后端根本不知道浏览器何时关闭。这个只能用浏览器自带的缓存。

qq_44695769的博客 1788

常见排序算法的最好、最坏、平均时间复杂度以及空间复杂度

文章目录思考如何分析一个排序算法?排序算法的执行效率排序算法的内存消耗排序算法的稳定性如何选择合适的排序算法?如何优化快速排序?解答思考题参考链接 思考 为什么插入排序比冒泡排序更受欢迎? 如何用快排思想在O(n)内查找第K大元素? 如何根据年龄给100万用户数据排序?(线性排序) 如何实现一个通用的、高性能的排序函数?(排序优化) 如何分析一个排序算法? 是否原地排序 是否稳...

樱木天亥 2万+

用Multisim复刻经典收音机:从零搭建超外差中波调幅接收机(附仿真源文件)

本文详细介绍了如何使用Multisim软件从零搭建超外差中波调幅接收机,复刻经典收音机的设计过程。通过模块化搭建、稳定性优化和增益分配等实战指南,帮助读者掌握超外差架构的核心技术,并附赠仿真源文件供实践参考。

weixin_28744423的博客 473

计数排序

思路 用辅助数组对数组中出现的元素进行计数(辅助数组下标值等于元素值时,辅助数组对应下标的元素值++),最终计数完后,扫描辅助数组,只要对应下标的值大于0,则把下标值从左到右回填到原数组中。 效率分析 时间复杂度:O(n + k),最好最坏情况都为O(n + k) 空间复杂度:O(k) 稳定性:稳定 适用性:计数排序可以说是最快的排序算法,当序列边界小,数值大小比较集中时此时效率高,不会浪费很多空间。 代码 public static void countSort(int[] arr) {

k909397116的博客 225

Qt 国产嵌入式操作系统实现文字转语音功能(ekho库)

Qt 国产嵌入式操作系统实现文字转语音功能(TTS)_tts驱动 转文字-优快云博客在继上篇文章之后,甲方粑粑不满意使用eSpeak发出的声音太难听了,这就不得不找个替代品,声音稍微好听了一些。使用ekho开源库。Ekho(余音)是一个免费、开源的中文语音合成软件。它目前支持粤语、普通话(国语)、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英文则通过Festival间接实现。Ekho支持Linux、Windows和Android平台。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2754

(四)DDR协议命令波形时序一——(ACT、Read、Write)

文章目录一、DDR命令真值表二、ACT激活命令时序要求2.1、ACTIVATE波形——tRRD、tFAW2.2、ACTIVATE波形——tRAS、tRC三、Read命令时序要求3.1、Read 波形——无Additive Latency3.2、Read 波形——有Additive Latency3.3、Read 波形——Additive Latency使用场景 一、DDR命令真值表 DDR的Command命令由CKE、CS#、RAS#、CAS#、WE#信号组成,这几个信号进行不同的搭配组合会形成不同的Co

Mr.翟的博客 6867

计数排序-《算法导论》学习笔记八

计数排序:假设n个输入元素中的每一个都是在0-k区间内的一个整数(k为正整数),对每一个输入元素x,确定小于x的元素个数,用一个0-k长度的数组做记录,例如输入数组的数为0-10长度,随机出[2,5,3,0,2,3,0,3],可以计算出一个0-10的数组,分别表示小于等于x的数的个数,于是有:0->2,1->2,2->4,3->7,4->7,5->8,6->8,7->8,9->8,10->8,然后再

lkness的博客 278

强化学习原理及应用作业之动态规划算法【SYSU_2023SpringRL】

本次实践作业将在以下环境进行: 该环境由一个 6×6 网格组成,其中黄色圆圈为智能体出发点,黑色格子为无法通过的墙壁,若智能体向着墙壁方向移动,则会停留在原地,地图边界的移动同理。带有黄色边框的格子为终止状态,即若智能体行动至此状态则整个 episode 结束。红色和绿色表示当前该状态的奖励值,奖励越高则绿色越深,奖励越低则红色越深。状态空间:36(0-35 这 36 个整数,左下角为 0,向右 +1,向上 +6)动作空间:4(0-3 这 4 个整数分别代表左、右、上、下)奖励函数:普通格子 -0.1,到

zik的博客 1398

《算法导论》 上的计数排序

#include iostream>#include string>using namespace std;const int MaxN = 40;void counting_sort(int A[],int B[], int k)...{    int C[MaxN];    //for(int i = 0; i     //    C[i] =0;//初始化    memset(C, 0,

yshuise的专栏 1125

【AI智能体】Coze 打通MySql实现数据报表展示应用搭建详解

Coze 打通MySql实现数据报表展示应用搭建详解

congge 3857

用 ABAP CDS View 把数据稳定抽到 SAP BW/4HANA:从 ODP 架构到增量机制的落地实践

本文探讨了SAP数据仓库中从业务系统抽取数据到SAP BW/4HANA的最佳实践,重点分析了基于ABAP CDS视图的抽取方法。文章指出CDS视图通过注解可实现元数据描述、增量机制的统一管理,替代传统抽取器。详细介绍了ODP架构如何作为抽取基础设施,以及从CDS到BW的完整链路。同时比较了三种增量抽取方式(BW管理时间戳、ODP通用增量、CDC触发器)的适用场景和注意事项,并强调版本兼容性和云环境连接差异对实施的影响。通过实际案例说明合理选择增量策略对数据仓库稳定性的重要性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 330

算法导论,习题8-2,计数排序原址排序

书上用伪代码呈现的计数排序是稳定的,但是要用n个辅助数组和k个

y519476132的专栏 883

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【算法导论之四】计数排序

1. 计数排序的思想     我们之前接触过的例如:插入排序,归并排序,快速排序,堆排序等都是基于集合元素之间的比较这一基本的思想,它们执行的时间复杂度最优是趋于O(nlgn),而计数排序的运行机制不是基于集合元素之间的大小比较,什么???不做比较还能区分出元素之间的大小?是啊,算法就是这么伟大,我刚看它的时候也是激动不已呢。     计数排序的基本思想是:对每一个输入元素 x ,确定出小于

天道酬勤 1416

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《算法导论》——计数排序

《算法导论》——计数排序 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)&gt;O(nlog(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n...

weixin_42809993的博客 502

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

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

【算法导论】计数排序

计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,此处k为某个整数。 计数排序的基本思想就是对每一个输入元素x,确定出小于x的元素个数。有了这一信息,就可以把x直接放到它在最终输出数组中的位置上。例如,如果有17个元素小于x,则x就属于第18个输出位置。当有几个元素相同时,这个方案要略作修改,因为不能把它们放在同一个输出位置上。 在计数排序算法的代码中,我们假定输入是个数组A[1..

cxllyg的专栏 2506

算法导论-计数排序

计数排序并不基于元素的比较,而是一种利用数组下标来确定元素正确位置的算法。计数排序的核心在于将输入的数据值转化为键值存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序算法的时间复杂度O(n + k)(k为整数的范围)。 简单描述就是,在一个有确定范围的整数空间中,建立一个长度更大的数组,如当输入的元素是 n 个 0 到 k 之间的整数时,建立一个长度大于等于k的数组。该数组的每一...

BLOG OF PETERMAOSX. 478

《算法导论》第 8 章—线性时间排序

本文深入讲解了《算法导论》第8章的线性时间排序算法,包括计数排序、基数排序和桶排序。这些算法不基于元素比较,能在特定条件下实现O(n)时间复杂度。计数排序适用于小范围整数排序,基数排序适合固定位数的数据,桶排序则对均匀分布数据效果最佳。文章提供了完整的C++代码实现和实际应用案例(如学生成绩排序、电话号码排序等),并分析了各算法的复杂度、稳定性和适用场景。通过对比传统比较排序,阐明了线性时间排序算法的优势和限制,帮助读者根据数据特点选择合适的排序方法。

2302_80961196的博客 1014

算法导论学习笔记(六):计数排序与基数排序

这里的两个排序的期望运行时间都是O(n),应该是到目前为止时间复杂度最低的了。 计数排序 计数排序假设n个输入元素的每一个都是介于0到K之间的整数,此处K为某个整数,在具体实现中,我们可以取K为n 个元素中最大的那个。 计数排序的基本思想:对每个输入元素x,确定小于x的元素个数。再根据这个信息,把x放到它最终输出数组中的位置 上。例如,有20个元素小于x,则x就放到输出数组的第21个位置

2786

【算法导论】c++实现计数排序

计数排序的基本思想为:对每一个输入的元素x,确定出小于x的元素的个数。有了这一信息,那么就可以把x直接放到相应的位置上。 特点: 1 需要临时的存储空间,如果排序数据范围特别大时,空间开销很大。 2 适合于排序0 - 100以内的数据。 3 排序的时间复杂度为O(n)。 #include #include const int size = 100; int * array_list

Harry的专栏 4086

计数排序 (算法导论 p98)

计数排序是一种算法复杂度 O(n) 的排序方法,适合于小范围集合的排序。比如100万学生参加高考,我们想对这100万学生的数学成绩(假设分数为0到100)做个排序。我们如何设计一个最高效的排序算法。本文不光给出计数排序算法的传统写法,还将一步步深入讨论算法的优化,直到时间复杂度和空间复杂度最优。 先看看计数排序的定义 Counting sort (sometimes referred to a

sunhui8888的专栏 1249
上一篇: 算法导论之七快速排序
下一篇: 算法导论之九链表
mengrennwpu
博客等级 码龄15年 262粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengrennwpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值