计数排序

从BIN文件到可烧录程序:深入理解ADI DSP程序读取背后的原理与安全边界 本文深入探讨了ADI DSP程序从BIN文件到可烧录程序的转换原理与安全边界,详细解析了JTAG接口、仿真器工作流程及Flash存储结构。通过Visual DSP++工具,开发者可以理解程序读取的底层机制,同时强调了知识产权保护的重要性,为嵌入式开发提供了实用建议。 阅读详情

计数排序

算法思想

计数排序是一种基于非比较的一种排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中,计数排序要求输入的数据必须有明确的范围。

算法步骤:

  1. 查找数组中的最大数和最小数
  2. 根据最大数和最小数生额外的辅助数组(max-min+1)
  3. 在辅助数组对应位置记录原数组每个数字出现的次数
  4. 根据辅助数组调整原始数组

举个简单的例子 arr = [2,0,-2,-1,3,1,3],最小数字min=-2,最大数字max=3,所以产生一个长度为(3-(-2)+1)= 6的辅助数组countArr

image-20200203141458269

下一步就是从头遍历arr数组,数字2对应的在countArr中的位置是 2-min = 4,数字-1在countArr中对应的位置为-1-min = 1。通过这样计算 可以得到每个数字在countArr中对应的位置,并计数,就会得到下面的结果

image-20200203142608042

然后把对应的数字每个统计的数字从小到大的更新到原始数组中就完成了排序。

对于计数排序来说,它是一种稳定的排序算法,只需要把数组遍历一次就可以完成排序,所以时间复杂度为 O(n)O(n)O(n),但是在反向填充原始数组的过程中,需要遍历的辅助数组的长度为 n+mn+mn+m ,所以整体排序的时间复杂度为 O(n+m)O(n+m)O(n+m),空间复杂度为 O(n+m)O(n+m)O(n+m)。

看样下面的动画演示
在这里插入图片描述

代码实现

#include <iostream>
#include <vector>

using namespace std;

/*
* 计数排序
*/
void countSort(vector<int>& vec) {
    // 数量少于两个直接返回
	if (vec.size() < 2) {
		return;
	}
    
	int min = vec[0];  // 定义最小值并初始化
	int max = vec[0];  // 定义最大值并初始化
    // 查找数组中的最小值和最大值
	for (int i = 0; i < vec.size(); i++) {
		min = min < vec[i] ? min : vec[i];   
		max = max > vec[i] ? max : vec[i];
	}
	// 如果最大值和最小值相等,表示数组中的数字都是相同的,直接返回
	if (min == max) {
		return;
	}

	vector<int> countVec(max - min + 1, 0);  // 开辟一个max-min+1长度大小的数组,并初始化

    // 遍历数组中的每个元素并计数
	for (int i = 0; i < vec.size(); i++) {
		countVec[vec[i] - min]++;
	}
    
	int index = 0;  // 用于记录原始数组的下标
    // 把辅助数组更新到原数组中
	for (int i = 0; i < countVec.size(); i++) {
        // 直到计数减为零,在进行下一次循环
		while (countVec[i]) {
			vec[index] = i+min; 
			index++;
			countVec[i]--;
		}
	}
}

int main() {
	vector<int> arr = { -1, 2, 0, 4, 3, 6, 5, 8, -2, 1, 3, 0, 3, 6, 5, 2 };
	countSort(arr);
	for (int i = 0; i < arr.size(); i++) {
		cout << arr[i] << " ";
	}
	cout << endl;

	return 0;
}

总结

  • 稳定性:稳定
  • 时间复杂度:O(n+m)O(n+m)O(n+m)
  • 空间复杂度:O(n+m)O(n + m)O(n+m)

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

使用 MATLAB/Simulink + Simscape Electrical,构建一个含储能的微电网系统,实现储能系统与并网逆变器的协同控制 摘要:本文基于Simulink平台,详细介绍了微电网中储能系统与并网逆变器的协同控制建模与仿真方法。主要内容包括:1)构建包含光伏、风电、锂电池和双向DC-DC变换器的微电网系统;2)设计并网逆变器的PQ/Vf双模式控制策略;3)实现储能系统与逆变器的协同控制逻辑,包括SOC保护和功率分配;4)通过多种工况仿真验证系统性能。结果表明,该系统能有效维持微电网稳定运行,支持并网/离网无缝切换。文章还探讨了优化方向和应用扩展,为新能源微电网控制提供了实用参考。 阅读详情

相关推荐

避坑指南:Python模拟抖音扫码登录时,那些你可能会遇到的‘Referer’和‘Token’校验问题

本文深入解析Python模拟抖音扫码登录时常见的Referer校验与Token失效问题,提供五大陷阱的解决方案。从动态fp参数生成到Referer校验策略,再到Token生命周期管理,手把手教你破解抖音登录接口的反爬机制,助力开发者高效完成自动化登录。

weixin_42573113的博客 780

什么是计数排序?

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 1. 计数排序的特征 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。 由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间

Free雅轩的博客 403

STM32实战:ADXL345传感器驱动与数据采集全解析(IIC/SPI双模式适配)

本文详细解析了STM32驱动ADXL345传感器的全流程,包括IIC和SPI双模式适配、硬件连接、寄存器配置及数据采集处理。通过实战代码示例和常见问题排查指南,帮助开发者快速实现高精度加速度数据采集,适用于运动检测、姿态识别等多种嵌入式应用场景。

weixin_29171087的博客 313

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

概念 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 图片演示 Java 代码实现 /** * @ClassName: Test9 * @Description: 计数排序 * @Author: wangjie * @Date: 2020/1/8 9:09 * @Phone: 123 *...

追风无念 312

视频教程-Ps教程之神奇的Photoshop自动化技术-Photoshop

Ps教程之神奇的Photoshop自动化技术 10年以上IT行业工作经验、三...

weixin_28812857的博客 1472

【现代电路理论】【2】考尔法设计无源单口网络

夏 弥:其实你在冰面上看到鱼浮上来 明年冬天如果你还在那里,那鱼还是会上来换气 那时候你就可以带一把冰镐 把冰面砸开把鱼捞上来熬汤

痛苦的时候装出幸福相,这不是那么难做到的事 2882

计数排序算法实现

计数排序算法,利用空间换取时间 //计数排序 #include #include //MAX为需要排序的数据中,最大的数值 #define MAX 40 void sort(int* input, int* output, int length){ int Temp[MAX] = { 0 }; for (int i = 0; i < length; i++){ Temp[inp

Liangmh的专栏 569

【系统移植】 移植主线U-Boot(v2024.01-rc3)到RK3399

[系统移植] 移植主线U-Boot(v2024.01-rc3)到RK3399

Systemcall名屋 1003

找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

这里对笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算法原理分析、图解/flash演示/视频演示、算法代码、笔试面试重点分析、笔试面试题等板块,希望能帮助大家真正理解这些排序算法,并能使用这些算法的思想解决一些题。不多说了,下面就进入正题了。

寒小阳 3万+

NVIDIA Isaac GR00T N1 入门教程(一) 人形机器人多模态大语言模型

英伟达™ Isaac GR00T N1 是世界上首个用于通用仿人机器人推理和技能的开放式基础模型。该跨体模型采用多模态输入(包括语言和图像)在不同环境中执行操作任务。GR00T N1 在一个庞大的仿人机器人数据集上进行训练,该数据集包括真实捕获数据、使用英伟达 Isaac GR00T Blueprint 组件生成的合成数据(神经生成轨迹示例)以及互联网规模的视频数据。通过后期训练,它可以适应特定的应用、任务和环境。

2506_90492529的博客 3048

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版下载及安装教程

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版网盘下载及安装教程

智慧空间实验室 2379

排序——计数排序(Count sort)

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

努力中的老周的专栏 3万+

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

WW、forever的博客 554

排序之计数排序

计数排序是一种线性时间复杂度的排序算法,适用于处理整数且整数的范围不大的情况。它是基于这样的思想:对于每个元素,我们可以计算出它在排序后数组中的位置,然后将元素放到该位置。计数排序的基本步骤如下:以下是计数排序的简单理解:将每个元素放到它在排序后数组中的位置上,我们可以使用遍历:给定一个长度为 n 的数组 arr ,其中的元素都是“非负整数”由于 的各个索引天然有序,因此相当于所有数字已经排序好了。接下来,我们遍历 ,根据各数字出现次数从小到大的顺序填入 arr 即可: 但是假设输入数据是商品对象,

Small_entreprene的博客 1176

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计数排序和稳定的计数排序

计数排序不是基于元素比较,而是利用数组下标来确定元素的正确位置。计数排序是一个稳定的排序算法。当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k),空间复杂度也是O(n+k),其排序速度快于任何比较排序算法。当k不是很大并且序列比较集中时,计数排序是一个很有效的排序算法。 算法思路 计数排序的算法思路是定义一个大小为序列最大值-最小值的大小的数组,遍历每一个元素,将其映射到数组...

weixin_42559610的博客 3192

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计数排序详解

计数排序的重点是:将序列中的元素作为键存储在额外的数组空间中,通过遍历来排序

weixin_44713306的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

排序算法 计数排序(普通计数排序、桶排序)

将区间[0, 1)划分为n个大小相等的子区间(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数(此处并非比较各元素的大小,而是通过对元素值的计数和计数值的累加来确定)。当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序,堆排序)。

qq_36511401的博客 1万+

Java实现计数排序

1 问题描述 给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列。 2 解决方案 2.1比较计数排序 下面算法的时间复杂度为O(n^2),空间复杂度为O(n)。此方法对于任意一组数据均可排序。 package com.liuzhen.practice; public class Main { public void comparisonCountingSort(int...

南 墙 1万+

Java计数排序

计数排序的基本思想就是:加入输入一个数x,如果我们可以找到比x小的数有几个,那么就可以直接将x放入到对应的输出数组的位置。 比如输入一个数x=12,发现在输入的数据中,比12小的有4个,那么毫无疑问12就该排在第五位。 废话不多说,代码中有详细的思路讲解: import java.util.Arrays; /** * 计数排序2 * 中间数组 通过数组下标来表示原始数组的值,来统计每个元素出...

qichangjian的博客 3825

比较计数排序和分布计数排序

比较计数排序 针对排序列表中的每一个元素,算出列表中小于该元素的元素个数,并把结果记录在一张表中。这个“个数”指出了该元素在有序列表中的位置。例如一个列表A中有一个元素为10,而小于10的元素个数有5个,那么10应该排在第六个位置上,也就是A[5](下标从0开始)。这个算法称为比较计数排序。 下面来个图形象的说明。 A[0…5] 62 31 84

淡然坊 4734

计数排序就是这么容易

文章目录前言1.计数排序(Counting Sort)1.1.计数排序(Counting Sort)2.原理2.1.步骤2.2.实例题目3.代码3.1.代码4.扩展阅读4.1.局限性 前言 声明:参考来源互联网,有任何争议可以留言。站在前人的肩上,我们才能看的更远。 本教程纯手打,致力于最实用教程,不需要什么奖励,只希望多多转发支持。 欢迎来我公众号,希望可以结识你,也可以催更,微信搜索:JavaPub 有任何问题都可以来谈谈 ! 计数排序是比较容易的排序算法,但是对数量级较小的整数排序很.

JavaPub 655

计数排序 C++

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

haiki66的博客 583
上一篇: 堆排序
下一篇: 桶排序
黑暗主宰
博客等级 码龄9年 72粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值