C++ 计数排序

笔记: 排序算法——计数排序(C++实现) 计数排序 计数排序伪代码 C++实现 测试 基数排序 基数排序伪代码 C++实现 测试 阅读详情

计数排序的原理:

(1)首先,找出最大的元素,给“count[ ]”申请“最大元素的下标+1”个单元(因为数组下标是从0开始的,所以要+1);

(2)然后,统计每个元素出现的次数,把次数存到“count[ ]”里;

(3)最后,通过一个元素出现的次数-1,从而算出正确顺序的位置,再把元素放进去,就有顺序了。

  因为不知道范围的大小,所以需要申请内存,如果知道范围的大小,就可以直接声明。

#include <iostream>
#include <stdlib.h>
using namespace std;

/**********************************************/
/*  计数排序
/*********************************************/

void CountingSort(int array[], int n)
{
	int i;
	int largest = array[0];  //设最初最大元素默认是array[0]
	int *temp = new int[n];  //申请一个n个int元素的数组内存

	for (i = 1; i < n; i++)
	{
		if (largest < array[i])  //找出最大元素
		{
			largest = array[i];
		}
	}

	int *count = new int[largest + 1];  //申请一个[largest+1]个int元素的数组内存
	for (i = 0; i <= largest; i++)
	{
		count[i] = 0;  //初始化
	}

	for (i = 0; i < n; i++)
	{
		count[array[i]]++;  //计算array数组每个元素出现的次数
	}

	for (i = 1; i <= largest; i++)
	{
		count[i] = count[i - 1] + count[i];  //count数组元素出现次数的累加
	}

	for (i = n - 1; i >= 0; i--)
	{
		temp[count[array[i]] - 1] = array[i];  //将array[]数组的元素赋给已经排好位置的temp[]数组
		count[array[i]]--;  //数组元素的总次数减少
	}

	for (i = 0; i < n; i++)
	{
		array[i] = temp[i];  //将排好顺序的元素赋给array[]数组
	}

	delete[] count;  //释放内存
	count = NULL;
	delete[] temp;  //释放内存
	temp = NULL;
}


int main(void)  //主程序
{
	const int n = 6;  //数组元素的数量
	int array[n];
	cout << "请输入6个整数:" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}

	cout << endl;  //换行

	CountingSort(array, n);  // 调用CountingSort函数  进行排序

	cout << "由小到大的顺序排列后:" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << "Array" << "[" << i << "]" << " = " << array[i] << endl;
	}

	cout << endl << endl;  //换行

	system("pause");  //调试时,黑窗口不会闪退,一直保持
	return 0;
}

运行结果:

C++ 统计数组中元素的出现次数 1.获取数组长度 参考 https://www.cnblogs.com/tanrong/p/8516948.html 2.统计次数 以C++程序为例 #include <iostream> using namespace std; template <class T> int getArrayLen(T& array){ //使用模板定义一 个函数ge... 阅读详情

相关推荐

C++排序算法之计数排序

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

YF_Li123的博客 8763

C++算法之计数排序

C++算法之计数排序 文章目录C++算法之计数排序一、算法描述二、代码实现三、复杂度分析 一、算法描述 给定长度为n的序列,假设已知序列元素的范围都是[0..K]中的整数,并且K的范围比较小(例如10^6,开长度为10^6左右的int类型数组所占用的内存空间只有不到4M)。解决该问题的计数排序算法描述如下: 使用整数数组cnt统计[1..K]范围内所有数字在序列中出现的个数。 使用变量i枚举1到K,如果i出现了cnt[i]次,那么在答案序列的末尾添加cnt[i]个i。 下图是一个n=6, K=3的例

R_mine的博客 4511

C++模板计数排序

C++模板计数排序简介

上善若水 1575

计数排序算法——C++

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

净无邪博客 3707

C++不知算法系列之计数排序算法的计数之巧

计数排序是较简单的排序算法,其基本思想是利用数组索引号有序的原理。如对如下的原始数组//原始数组使用计数排序创建一个排序数组。数组的大小由原始数组的最大值决定,如原始数组的最大值为9,则排序数组的长度为9+1。为什么排序数组的长度需要如此设置,后文将做解释。//初始化值为 0读取原始数组中的数据,以此数据作为排序数组的索引号,此数据出现的次数为排序数组的值。这也解释了为什么排序数组的长度必须是原始数组中最大值加1。因为排序数组必须能为原始数组中的最大值提供索引号。然后输出排序数组中的值不为0。

y6123236的专栏 1222

C++简单排序——计数排序

简单排序——计数排序

小天狼星_布莱克 的博客 1798

【计数排序】c++实现计数排序

计数排序:计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序O(n),计数排序要求输入的数据必须是有确定范围的整数。(直方图统计,再按照顺序扔出来) 动图演示: 程序代码: #include <iostream> #include <vector> using namesapce std; void countingSort(vector<int>& arr, int max

yizhizainulii的博客 1354

C++实现计数排序算法

计数排序(Counting Sort)是一种非比较型排序算法,适用于一定范围内的整数排序。在计数排序中,我们将整数范围作为计数数组的索引,每个索引的计数值代表原数组中该整数的出现频率。这种方法对一定范围内的数据排序极为高效,尤其是当数据分布较为均匀时。计数排序的独特之处在于它不是通过比较元素大小来进行排序,而是通过计算元素的出现频率并进行适当的索引累计来确定元素的位置。

weixin_42376614的博客 474

计数排序 C++

知识点 C++产生随机数 算法系列-计数排序 计数排序步骤 数组开辟空间:计算大小,初始化 遍历排序数组,对计数数组赋值 遍历计数数组,对原数组排序 时间:O(n),空间:O(m),m是最大值与最小值的差,可能是n #include<iostream> #include<stdlib.h>//随机数使用 #include<time.h> #inclu...

haiki66的博客 583

05-SA8155 QNX Display框架及代码分析(1)

显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。TODO。

静虚待令,有物混成 1万+

用RK3588+FPGA搞定Cameralink高速相机?这份保姆级硬件选型与接口配置指南请收好

本文详细介绍了如何利用RK3588与FPGA构建Cameralink高速相机系统,涵盖硬件选型、接口配置及性能优化等关键步骤。通过异构计算架构和精准的带宽分配,实现工业视觉检测和科研成像领域的高效解决方案,特别适合需要实时处理的复杂应用场景。

weixin_30493401的博客 642

C++计数排序

计数排序是一个非基于比较的排序算法,元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的。该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当 的时候其效率反而不如基于比较的排序,因为基于比较的排序的时间复杂度在理论上的下限是 O(n log n)。

ZhengHaoyu44的博客 937

LoFTR训练避坑指南:从零到一复现论文训练流程

本文是一份详细的LoFTR模型训练避坑指南,旨在帮助开发者从零开始复现论文训练流程。文章系统性地讲解了环境配置、数据准备、代码调试与显存优化等关键步骤,并针对常见的训练错误提供了解决方案,确保训练过程顺利进行。

weixin_29091837的博客 204

c++ 排序算法 计数排序

参考:排序算法的c++实现——计数排序 代码: #include<iostream> #include<ctime> using namespace std; void Individual(int A[], int size) { srand((unsigned)time(NULL)); for (int i = 0; i < size; i++) A[i] = rand() % 100; } void Output(int A[], int size) { co

然、的博客 298

如何理解反步法设计控制器?

假设以二阶系统为例,被控对象的系统状态方程为: 基于反步控制的具体方法如下: 1.1步骤一 定义期望状态为xd,状态误差e1,为: e1=x1-xd; 则e1的导数为: 1.2步骤二 定义虚拟控制量为: e2定义为: 1.3步骤三 定义Lyapunov能量函数为: 1.4步骤四 定义总Lyapunov能量函数为: 因此设计的控制律为: 设计c>0,则: 满足Lyapunov的稳定性判定条件...

weixin_42736130的博客 2万+

NT35310 - LCD显示屏

NT35310 是一个低功耗、26 万色、单芯片的 TFT-LCD 控制器/驱动器,分辨率 480*320,它有一个 345600 字节的显示 RAM 和一整套控制功能。NT35310 支持数字接口(MDDI),MIPI 接口,RGB 接口,8 / 9 / 16 / 18 位8080 接口。可以实现指定的窗口区域可以有选择地更新,以便可以显示运动图像。同时也可以独立显示静止的图像区域。...

m0_62444125的博客 3323

C++实现排序算法之计数排序

C++实现排序算法之计数排序 https://www.runoob.com/w3cnote/counting-sort.html

李昊的博客 251

室内温度控制仿真(Simulink+PLC)

本篇博客将会带领大家解读Simulink自带的仿真模型(Thermal Model of a House),之后再讨论PLC控制系统控制环境温度的一些经验方法

RXXW_Dor的博客 3462

c++之计数排序算法

  计数排序(Counting sort) 是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。   核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 这种排序有两个局限: 1、要排序的类型必须是有序类型(如整形),像浮点型这种无序数据类型则不能用计数排序。 2、要排序的数据必须有固定的小范围,否则就会数

欧特GO 2162

LeRobot 机器人学习(Robot Learning)教程(二)经典机器人学

本文探讨了机器人学中基于学习的方法与传统动力学方法的对比与发展趋势。文章指出,传统方法依赖精确的动力学模型和大量人工调参,面临跨任务泛化能力弱、工程复杂度高、物理建模局限性等问题。随着机器学习技术的进步和机器人数据集的丰富,基于学习的方法展现出三大优势:(1)能够实现跨任务与实体的泛化;(2)降低对人类专业知识的依赖;(3)利用历史数据优化性能。文中以平面机械臂为例,分析了传统逆运动学方法的计算复杂性和环境适应性挑战,并指出基于学习的方案在处理高维感知输入、复杂接触动力学等方面具有明显优势。文章认为,结合物

2506_90492529的博客 1066

linux cma alloc fail 问题分析

摘要:日志显示CMA连续内存分配失败(错误码-ENOMEM),请求128页(512KB)内存时因CMA区域不足或内存碎片导致失败。分析发现系统CMA总内存131072KB,空闲65536KB。解决方案包括:1)手动触发内存碎片整理;2)修改设备树或内核配置增大CMA区域(如从16MB增至20MB)。通过调整CONFIG_CMA_SIZE_MBYTES或设备树中的size参数可解决该问题。

陌上花开缓缓归以的博客 799

【C++算法】计数排序

计数排序,并非基数排序。暂时只支持数值型 编译环境:C++11 代码实现如下: #include <cstring> // std::memset #include <type_traits> // std::declval /* 计数排序 * [@beg, @end) 待排序的范围,同时保存结果,须支持前向迭代 * [@min, @max) 待排序范围的...

我的博客 530

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++实现选择排序、冒泡排序和计数排序

在编程中我们常常会需要排序,但是排序最简单的是哪一种?我们可以用sort函数。

alexwang211的博客 2757

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

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C/C++ 计数排序

计数排序是一种非基于比较的排序算法,该算法于1954年由提出。找出待排序的数组中最大和最小的元素统计数组中每个值为i的元素出现的次数,存入数组C的第i项对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)反向填充目标数组:将每个元素i放在新数组的第C[i]项,每放一个元素就将C[i]减去1它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n + k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)>......

小嗷犬的博客 1837

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

sort排序 计数排序 map set C++ 蓝桥杯

sort排序、计数排序、set容器、map容器、C++、蓝桥杯

2301_79006415的博客 1094

c++——计数排序

计数排序

tzj511427的博客 372
上一篇: C++ 基数排序
下一篇: C++ 二叉查找树 —— 插入、遍历、查找、删除、销毁
dong.x_辛旭东
博客等级 码龄9年 11粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值