排序算法:非比较排序(计数排序)

news2025/1/13 7:33:21

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

目录

1.计数排序

1.1基本逻辑:

1.2改进逻辑:

代码演示:

测试代码:

1.3计数排序的缺陷:

 2.特点总结


1.计数排序

在之前我们接触到的排序算法都是通过两数比较,按需排序,那么本期就来见识一下不需要进行比较就可以排序的一种新的排序算法:计数排序

1.1基本逻辑:

1. 统计一组数组中每个数据出现的次数

2. 根据统计出的次数进行归位 

有一组数据,还有一个统计次数的数组CountA(默认里面都是0),在这组数据中从头开始遍历,假设这组数据的第一个元素为6,那么就需要CountA中下标为6的元素加一,依次类推,直到遍历完整个数据。

统计出每个数据出现的次数,将不为0的数据按照出现的次数依次拷贝至原数组,这样子就完成了排序。

那么这里就存在一个问题,不是每一次排序都是10以内的数据,那么如果是100~109之间的数据进行排序,我们对应是不是也要开0~109这么大的数组然后只使用100~109这个区间进行数据的统计,这样子也是可以的,但是太浪费空间,所以我们可以进行改进。

1.2改进逻辑:

先找出整个数据中的最大值和最小值,求出它们的差值,也就是范围大小,然后创建一个统计次数的数组CountA,将里面的值都置为0,然后就到了统计次数,在统计出现次数时需要将他原来的值减去最小值,然后在创建的数组CountA里面找对应的下标,依次类推,在遍历完整个数据之后,就需要按照对应次数将数据拷贝至原数组,从CountA中往回拷贝时通过对ConutA中下标加上最小值然后拷贝至原数组,这样子即可完成排序。

代码演示:
//非比较排序
//计数排序
void CountSort(int* a, int n)
{
	//找出最大值和最小值
	int min = a[0], max = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] < min)
		{
			min = a[i];
		}
		if (a[i] > max)
		{
			max = a[i];
		}
	}

	//计算出范围
	int range = max - min + 1;

	//开辟空间
	int* CountA = (int*)malloc(sizeof(int) * range);
	if (CountA == NULL)
	{
		perror("CountA malloc fial");
		exit(-1);
	}
	memset(CountA, 0, sizeof(int) * range);
	
	//统计次数
	for (int i = 0; i < n; i++)
	{
		CountA[a[i] - min]++;
	}

	//排序
	int k = 0;
	for (int j = 0; j < range; j++)
	{
		//根据出现的次数拷贝几次
		while (CountA[j]--)
		{
			a[k++] = j + min;
		}
	}
}
测试代码:
void TestCountSort()
{
	int a[] = { 6,1,6,8,5,8,5,4,2,1 };
	PrintArry(a, sizeof(a) / sizeof(int));
	CountSort(a, sizeof(a) / sizeof(int));
	PrintArry(a, sizeof(a) / sizeof(int));
}

int main()
{
	TestCountSort();
	return 0;
}

1.3计数排序的缺陷:

1. 依赖数据范围,适用于范围集中的数组。

2. 只能用于整形。

 2.特点总结

1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
2. 时间复杂度:O(MAX(N,range))  (N和range谁大就是谁)
3. 空间复杂度:O(range)
4. 稳定性:稳定

 

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2018 国际AIOps挑战赛单指标数据集分析

关于数据集 2018年国际AIOps 由中国建设银行、清华大学以及必示科技公司联合举办&#xff0c;尽管已经过去了这么长时间&#xff0c;其提供的比赛数据依然被用于智能运维相关算法的研究。这里我们对此数据集做简单的分析&#xff0c;把一些常用的数据分析方法在这里进行略微地…

Spring面试题13:Spring中ApplicationContext实现有哪些?Bean工厂和Applicationcontext有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring中ApplicationContext实现有哪些? 在Spring框架中,有以下几种ApplicationContext的实现: ClassPathXmlApplicationContext:从类路径下的…

基于springboot消防员招录系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

​Segment-and-Track Anything——通用智能视频分割、跟踪、编辑算法解读与源码部署

一、 万物分割 随着Meta发布的Segment Anything Model (万物分割)的论文并开源了相关的算法&#xff0c;我们可以从中看到&#xff0c;SAM与GPT-4类似&#xff0c;这篇论文的目标是&#xff08;零样本&#xff09;分割一切&#xff0c;将自然语言处理&#xff08;NLP&#xff…

【数据结构】二叉排序树;平衡二叉树的知识点学习总结

目录 1、二叉排序树 1.1 定义 1.2 查找操作 1.3 插入操作 1.4 删除操作 1.5 C语言实现二叉排序树的基本操作 2、平衡二叉树的知识点总结 2.1 定义 2.2 插入操作 2.3 调整“不平衡” 2.4 删除操作 1、二叉排序树 1.1 定义 二叉排序树&#xff08;Binary Search …

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细!)

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细&#xff01;) Linux搭建Hadoop集群(CentOS7hadoop3.2.0JDK1.8Mapreduce完全分布式集群) 本文章所用到的版本号&#xff1a; CentOS7 Hadoop3.2.0 JDK1.8 基本概念及重要性 很多小伙伴部署集群用hadoop用mapr…

C++设计模式_06_Decorator 装饰模式

本篇将会介绍Decorator 装饰模式&#xff0c;它是属于一个新的类别&#xff0c;按照C设计模式_03_模板方法Template Method中介绍的划分为“单一职责”模式。 “单一职责”模式讲的是在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随…

HT for Web (Hightopo) 使用心得(2)- 2D 图纸、节点、连线 与基本动画

概括来说&#xff0c;用 HT for Web 做可视化主要分为两部分&#xff0c;也就是 2D 和 3D。这两部分需要单独创建。在它们被创建完成后&#xff0c;我们再把它们集成到一起。 HT for Web 的 2D 部分主要是指 ht.graph.GraphView (简称 GraphView&#xff0c;也就是 2D 图纸)。…

Java项目:SSM的食堂点餐系统

作者主页&#xff1a;Java毕设网 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 一、相关文档 系统中的核心用户是系统管理员&#xff0c;管理员登录后&#xff0c;通过管理员菜单来管理后台系统。主要功能有&#xff1a;个人中心、用户管理…

自动发现、zabbix_proxy代理

自动发现&#xff1a;自己去发现被监控的主机 它能够根据用户事先定义的规则自动添加监控的主机或服务等。 优点 加快Zabbix部署&#xff08;agent&#xff09; 简化管理 在快速变化的环境中使用Zabbix&#xff0c;而不需要过度管理 部署自动发现(新机子) rpm -Uvh https://re…

OSI 七层网络协议最全的图

OSI 七层网络协议最全的图 文章出处&#xff1a;https://www.shuzhiduo.com/A/RnJWawowdq/

DINO(ICLR 2023)

DINO&#xff08;ICLR 2023&#xff09; DETR with Improved deNoising anchOr box DINO发展&#xff1a; Conditional DETR->DAB-DETR&#xff08;4D,WH修正&#xff09; DN-DETR&#xff08;去噪训练&#xff0c;deNoising 稳定匹配过程&#xff09; Deformable DETR&…

后端大厂面试-16道面试题

1 java集合类有哪些&#xff1f; List是有序的Collection&#xff0c;使用此接口能够精确的控制每个元素的插入位置&#xff0c;用户能根据索引访问List中元素。常用的实现List的类有LinkedList&#xff0c;ArrayList&#xff0c;Vector&#xff0c;Stack。 ArrayList是容量…

基于同名面片的TLS测站点云配准

1、原理介绍 2、代码介绍 基于C++编写的程序代码如下,其依赖eigen矩阵运算库,在创建工程时包含库目录中使用了相对路径,因此其下载下来直接可以运行,不用单独在设置环境,非常方便。

Java项目:SpringBoot高校宿舍管理系统

作者主页&#xff1a;Java毕设网 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 一、相关文档 宿舍是大学生学习与生活的主要场所之一&#xff0c;宿舍管理是高校学工管理事务中尤为重要的一项。随着我国高校招生规模的进一步扩大&#xff0…

异步回调

Future 设计的初衷&#xff1a;对将来的某个事件的结果进行建模 package com.kuang.future;import com.kuang.pc.C;import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.uti…

ubuntu | 安装NVIDIA套件:驱动、CUDA、cuDNN

CUDA 查看支持最高的cuda版本 nvidia-smiCUDA Version:12.2 区官网下在12.2.x最新的版本即可CUDA Toolkit Archive | NVIDIA Developer 下载安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo…

《开发实战》16 | 缓存设计:缓存可以锦上添花也可以落井下石

不要把 Redis 当作数据库 Redis 的确具有数据持久化功能&#xff0c;可以实现服务重启后数据不丢失。这一点&#xff0c;很容易让我们误认为 Redis 可以作为高性能的 KV 数据库。Redis 的特点是&#xff0c;处理请求很快&#xff0c;但无法保存超过内存大小的数据。第一&#…

leetcode 22. 括号生成

2023.9.24 看到组合两个字&#xff0c;想到了回溯。 大致思路是将所有可能的组合列出来&#xff0c;通过中止条件筛选掉无效的括号。 第一个中止条件&#xff1a;如果右括号数量大于左括号&#xff0c;那括号肯定无效。 第二个中止条件&#xff1a;当左右括号数量相等&#x…

swiper使用

介绍 Swiper&#xff08;swiper master&#xff09;是一个第三方的库&#xff0c;可以用来实现移动端、pc端的滑动操作。&#xff0c;swiper应用广泛&#xff0c;使用频率仅次于jquery, 轮播图类排名第一&#xff0c;是网页设计师必备技能&#xff0c;众多耳熟能详的品牌在使用…