基础排序算法【计数排序】非比较排序

news2024/11/24 18:44:57

基础排序算法【计数排序】非比较排序

  • ⏰【计数排序】
    • 🕐计数
    • 🕦排序
    • 🕓测试
  • ⏰总结:

⏰【计数排序】

计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用

> 基本思路:
1.统计数据出现的次数
2.根据统计的结果将序列拷贝回到原来的序列中去。

注意:这里需要用到相对位置映射。不能单纯的绝对位置映射。
为什么?因为会有不必要的空间浪费。

待排序数组元素下标0对应着计数数组下标0,待排序元素下标1对应的计数数组下标1,待排序元素下标2对应着计数数组下标2,……待排序元素100的下标,对应着计数数组下标100.
我们需要开辟一个计数数组,专门用来计算每个数据出现的次数,而理论上该数组该开辟多大呢?如果原数组中最大值为10,则拷贝数组开辟10个空间即可。
在这里插入图片描述

这里计数数组开辟后,需要全部初始化为0.

首先我们需要对原数组进行计算,统计每个数据出现的次数。
在这里插入图片描述
然后我们根据计数数组里的数据来进行排序
在这里插入图片描述
这种是属于决定位置映射,而当数据很大时,比如最大值为100时,就需要计数数组开辟100个空间,而最小值为90值,那么前90个空间就相当于浪费了。
在这里插入图片描述

所以我们需要使用相对位置映射。这样可以减少空间的浪费。
即计数数组空间大小的开辟取决于待排序序列中的最大值和最小值。它的范围就是range=最大值-最小值+1.
这样前面的空间就不会开辟浪费了。
在这里插入图片描述

只不过待排序数组在计数数组中的位置是相对的。
比如待排序数组-最小值才是在计数数组的位置。
比如90-最小值=0.它在计数数组中就是下标为0的值
92-最小值=2,它在计数数组中就是下标为2的值
100-最小值=10,它在计数数组中就是下标为10的值。
在这里插入图片描述

🕐计数

第一步:统计每个数据出现的次数
1.遍历待排序数组,将最大值最小值获取出来
2.开辟计数数组
3.初始化计数数组
4.计数

void Countsort(int *a,int n)//计数排序O(N+range)
{
	int i = 0;
	int max = a[i], min = a[i];
	for (i = 1; i < n; i++)//遍历一遍原数组
	{
		if (a[i] > max)
		{
			max = a[i];
		}
		if (a[i] < min)
		{
			min = a[i];
		}
	}
	int range = max - min + 1;//计数数组开辟的大小由range确定

	int* counta = (int*)calloc(range,sizeof(int));//初始化计数数组都为0
	//calloc在开辟空间的同时也为数组初始化为0 
	
	//memset(counta, 0, sizeof(int) * range);也可以用memset初始化数组
	for (int i = 0; i < n; i++)
	{
		counta[a[i] - min]++;//相对位置映射
		//a[i]-最小值,是待排序数据在计数数组中的位置
	}

在这里插入图片描述
对于计数数组各个位置上的值,代表这个位置上的值出现了几次,1代表出现1次,2代表出现2次,3代表出现3次,0代表没有出现。

🕦排序

第二步:根据计数数组,对原数组进行覆盖

	int j = 0;
	for (int i = 0; i  < range; i++)
	{
		while (counta[i]--)//出现几次就往原数组放几次
		{
			a[j++] = i + min;//因为是相对位置映射,i位置上的数据并不真正是i而是i+min,将出现几次覆盖到原数组上去。
		}
	}

🕓测试

void Countsort(int *a,int n)//计数排序O(N+range)
{
	int i = 0;
	int max = a[i], min = a[i];
	for (i = 1; i < n; i++)//遍历一遍原数组
	{
		if (a[i] > max)
		{
			max = a[i];
		}
		if (a[i] < min)
		{
			min = a[i];
		}
	}
	int range = max - min + 1;

	int* counta = (int*)calloc(range,sizeof(int));//初始化计数数组都为0
	//memset(counta, 0, sizeof(int) * range);
	for (int i = 0; i < n; i++)
	{
		counta[a[i] - min]++;
	}
	//对计数数组排序,覆盖原数组
	//这个位置的值,代表了这个值出现了几次 1代表出现一次,2代表出现两次
	int j = 0;
	for (int i = 0; i  < range; i++)
	{
		while (counta[i]--)
		{
			a[j++] = i + min;//出现几次就往原数组放几次
		}
	}
}
int main()
{
	int a[] = { 909296939899100929390};
	int n = sizeof(a) / sizeof(a[0]);
	Countsort(a,n);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

在这里插入图片描述

⏰总结:

1.计数排序适合范围集中,且范围不大的整形排序。
当数据范围集中时,效率很高,但是适用范围及场景有限。
2.不适合范围分散和非整形的排序,如:字符串,浮点数。
3.计数排序时间复杂度为O(N+range),当range与n接近时效率很快。
4.空间复杂度O(range);
5.稳定性:稳定。

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

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

相关文章

并行分布式计算 并行算法与并行计算模型

文章目录并行分布式计算 并行算法与并行计算模型基础知识定义与描述复杂性度量同步和通讯并行计算模型PRAM 模型异步 PRAM 模型 &#xff08;APRAM&#xff09;BSP 模型LogP 模型层次存储模型分层并行计算模型并行分布式计算 并行算法与并行计算模型 基础知识 定义与描述 并…

15个最适合初创公司创始人使用的生产力工具

创业是一段激动人心且收获颇丰的旅程&#xff0c;同时也伴随着一些挑战。创始人往往要面对长时间的工作、紧迫的期限和大量的压力时刻。因此&#xff0c;初创公司创始人必须最大限度地利用他们的时间并利用他们可用的生产力工具——不仅是为了发展他们的业务&#xff0c;而且是…

Cron表达式简单介绍 + Springboot定时任务的应用

前言 表达式是一个字符串&#xff0c;主要分成6或7个域&#xff0c;但至少需要6个域组成&#xff0c;且每个域之间以空格符隔开。 以7个域组成的&#xff0c;从右往左是【年 星期 月份 日期 小时 分钟 秒钟】 秒 分 时 日 月 星期 年 以6个域组成的&#xff0c;从右往左是【星…

【精华】表格识别技术-MI

表格识别是指将图片中的表格结构和文字信息识别成计算机可以理解的数据格式&#xff0c;在办公、商务、教育等场景中有着广泛的实用价值&#xff0c;也一直是文档分析研究中的热点问题。围绕这个问题&#xff0c;我们研发了一套表格识别算法&#xff0c;该算法高效准确地提取图…

RabbitMq 的消息可靠性问题(二)---MQ的消息丢失和consumer消费问题

前言 RabbitMq 消息可靠性问题(一) — publisher发送时丢失 前面我们从publisher的方向出发解决了发送时丢失的问题&#xff0c;那么我们在发送消息到exchange, 再由exchange转存到queue的过程中。如果MQ宕机了&#xff0c;那么我们的消息是如何确保可靠性的呢&#xff1f;当消…

SQL的函数

文章目录一、SQL MIN() Function二、SQL SUM() 函数三、SQL GROUP BY 语句四、SQL HAVING 子句五、SQL EXISTS 运算符六、SQL UCASE() 函数总结一、SQL MIN() Function MIN() 函数返回指定列的最小值。 SQL MIN() 语法 SELECT MIN(column_name) FROM table_name;演示数据库 …

Numba witch makes Python code fast

一. 前言&#xff1a;numba&#xff0c;让python速度提升百倍 python由于它动态解释性语言的特性&#xff0c;跑起代码来相比java、c要慢很多&#xff0c;尤其在做科学计算的时候&#xff0c;十亿百亿级别的运算&#xff0c;让python的这种劣势更加凸显。 办法永远比困难多&a…

ASP.NET Core MVC 从入门到精通之接化发(二)

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

4.13实验 加测试题目

今天是个好日子,要搞栈的实验 没啥就是链栈和顺序栈 和出栈入栈,强大都是从最基本开始的 来和我一起写写吧 //顺序栈 typedef struct node{int *base;int *top;int sizer; }shed;//链栈 typedef struct Node{ int data; struct Node* next; }*stact,link; //顺序栈的初始化…

《绝对坦率》速读笔记

文章目录书籍信息概览&#xff08;第一部分 一种新的管理哲学&#xff09;建立坦率的关系给予并鼓励指导了解团队中每个人的动机协同创造成果&#xff08;第二部分 工具和技巧&#xff09;关系指导团队结果书籍信息 书名&#xff1a;《绝对坦率&#xff1a;一种新的管理哲学》…

北邮22信通:(12)二叉树的遍历书上代码完整版

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章&#xff1a; 下一篇文章&#xff1a; 目录 一.储存最简单数据类型的二叉树 代码部分&#xff1a; 代码效果&#xff1a; 运行结果&#xff1a…

解决JD-GUI-1.6.6 中文乱码

一、背景 在window环境下使用中遇到了乱码问题。 问题有两个&#xff1a; 一、从反编译代码的界面 CTRLC 复制是如果选中内容包含中文&#xff0c;贴到其他编辑器时&#xff0c;中文丢失。 二、打开xml文件、properties文件等包含中文时。中文在反编译界面中显示乱码。用其他工…

java反射教程

反射&#xff08;Reflection&#xff09;是 Java中的一种机制&#xff0c;它是一种特殊的面向对象编程技术。在 Java中&#xff0c;反射可以分为静态反射和动态反射两种。静态反射是指在 Java程序运行时才进行的一种反射&#xff0c;它可以保证程序运行时不会出现内存泄漏等错误…

数据分析的作用和意义?

数据分析的作用和意义&#xff1f;在当下数字化转型发展的大环境中&#xff0c;数据也成为企业商业成功与否的重要基础&#xff0c;如何利用好数据分析问题预测未来也成为更多企业面临的首要问题。而随时大数据的不断渗透&#xff0c;数据量和数据类型也越来越多&#xff0c;数…

asp.net车辆管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net车辆管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net车辆管理系统VS开发sqlserver数…

【CSIG图像图形技术挑战赛-开放世界目标检测竞赛】火热报名中!

竞赛名称&#xff1a;开放世界目标检测竞赛/Few Shot&#xff09;主办方: 中国图象图形学学会&#xff08;CSIG&#xff09;合作方: 360集团竞赛目的与意义&#xff1a;目标检测是计算机视觉中的核心任务之一&#xff0c;主要目的是让计算机可以自动识别图片中目标的类别&#…

Windows File Recovery使用教程

Windows File Recovery简介 Windows File Recovery是微软在2020年发布的命令提示符文件恢复工具&#xff0c;它不仅具有高成功率和高安全性&#xff0c;还适用于不同的文件系统和文件丢失场景。如果你需要从本地硬盘、USB设备、SD卡等设备中恢复意外丢失或删除的JPEG、PDF、…

分析Spring事务管理原理及应用

目录 一、Spring事务管理介绍 &#xff08;一&#xff09;基本理论 &#xff08;二&#xff09;实际工作中的举例 &#xff08;三&#xff09;简单应用举例 二、Spring事务配置介绍 &#xff08;一&#xff09;Spring事务属性介绍 传播属性&#xff08;传播行为&#xff…

车身控制模块BCM(Body Control Module)

1.BCM概述 车身控制模块BCM是高集成度的芯片。BCM的英文全称是Body Control Module。其控制对象是采用高灵敏度带唤醒及睡眠检测的高频收发器&#xff0c;实现车门车窗遥控上锁与开锁、电动后视镜、中控门锁、玻璃升降装置、车灯(远光灯、近光灯、位置灯、制动灯、转向灯、雾灯…

【RocketMQ】主从模式下的消费进度管理

在【RocketMQ】消息的拉取一文中可知&#xff0c;消费者在启动的时候&#xff0c;会创建消息拉取API对象PullAPIWrapper&#xff0c;调用pullKernelImpl方法向Broker发送拉取消息的请求&#xff0c;那么在主从模式下消费者是如何选择向哪个Broker发送拉取请求的&#xff1f; 进…