排序篇(五)----非比较排序

news2024/12/26 11:04:11

排序篇(五)----非比较排序

基本思想:

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

​ 统计每个元素出现的次数,然后根据元素的大小顺序将它们放入正确的位置。

​ 计数排序是一种小众的排序,它适合于数据密集的场景,按最大数的数值来开空间,比如一组数据中,最大的数据是1000,那么便会开一千个大小的空间,这种属于绝对映射,在极端的场景下,极易造成空间上的浪费.假设现在有10个数:5,99,88,1000,8888,452,635,82,777,555,只有10个数但是最大的数是8888因此要开8888大小的空间,剩余的空间全部都浪费了,

​ 因此绝大多数情况下,都会使用相对映射.

具体的步骤如下:

  1. 找出待排序数组中的最大值和最小值,并创建一个计数数组,长度为最大值和最小值之差加1。
  2. 遍历待排序数组,统计每个元素出现的次数,并将次数存储在计数数组的相应位置上。
  3. 对计数数组进行累加操作,得到每个元素在排序后数组中的最终位置。
  4. 创建一个与待排序数组长度相同的临时数组,用于存储排序后的结果。
  5. 从后向前遍历待排序数组,根据计数数组中每个元素的值,将元素放入临时数组的相应位置上。
  6. 将临时数组中的元素复制回待排序数组,完成排序。

在这里插入图片描述

//计数排序
void CountSort(int* a, int n)
{
	int min = a[0];
	int 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* count = (int*)malloc(sizeof(int) * range);
	if (count == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	memset(count, 0, sizeof(int) * range);
	for (int i = 0; i < n; i++)
	{
		count[a[i] - min]++;
	}
	int j = 0;
	for (int i = 0; i < range; i++)
	{
		while (count[i]--)
		{
			a[j++] = i + min;
		}
	}
}

代码解析:

  1. 找到数组中的最小值和最大值,以确定计数数组的大小。
  2. 然后,根据最小值和最大值计算计数数组的大小,并分配内存空间。
  3. 接下来,将计数数组的所有元素初始化为0。
  4. 然后,遍历原数组,统计每个元素出现的次数,将统计结果保存在计数数组中。
  5. 接着,使用两个循环,将计数数组中的元素按照次数依次放回原数组中。
  6. 最后,释放计数数组的内存空间。

计数排序的特性总结:

  1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。

  2. 时间复杂度:O(MAX(N,范围))

  3. 空间复杂度:O(范围)

  4. 稳定性:稳定

集中时,效率很高,但是适用范围及场景有限。
2. 时间复杂度:O(MAX(N,范围))
3. 空间复杂度:O(范围)

  1. 稳定性:稳定

​ 计数排序的时间复杂度为O(n+k),其中n为待排序数组的长度,k为计数数组的长度。计数排序是一种稳定的排序算法,适用于元素范围较小的情况。但是计数排序的缺点是当元素范围较大时,需要创建一个较大的计数数组,可能会占用较多的内存空间。

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

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

相关文章

flink选择slot

flink选择slot 在这个类里修改 package org.apache.flink.runtime.resourcemanager.slotmanager.SlotManagerImpl; findMatchingSlot(resourceProfile)&#xff1a;找到满足要求的slot&#xff08;负责从哪个taskmanager中获取slot&#xff09;对应上图第8&#xff0c;9&…

百元开放式耳机推荐哪款、性价比最好的开放式耳机推荐

随着蓝牙耳机产业的高速发展&#xff0c;目前最热门的蓝牙耳机莫过于开放式的&#xff0c;跟传统的蓝牙耳机相比&#xff0c;开放式的耳机拥有久戴不累、安全舒适等优势&#xff0c;所谓的“开放式耳机”&#xff0c;就是指不用塞入耳朵内&#xff0c;也能听音乐的耳机&#xf…

noip2011铺地毯

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n n n 张地毯&#xff0c;编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…

Codeforces Round 894 (Div. 3) D(数学题好难不会)

题目链接&#xff1a;Codeforces Round 894 (Div. 3) D 题目&#xff1a; 特马决定提高自己制作冰淇淋的技能。他已经学会了如何用两个球把冰淇淋做成圆锥形。 在痴迷冰淇淋之前&#xff0c;特马对数学很感兴趣。因此&#xff0c;他很想知道要制作完全n个不同类型的冰淇淋&am…

数学建模之Matlab基础操作

作者由于后续课程也要学习Matlab&#xff0c;并且之前也进行了一些数学建模的练习&#xff08;虽然是论文手&#xff09;&#xff0c;所以花了几天零碎时间学习Matlab的基础操作&#xff0c;特此整理。 基本运算 a55 %加法&#xff0c;同理减法 b2^3 %立方 c5*2 %乘法 x 1; …

Docker 日志管理 - ELK

Author&#xff1a;rab 目录 前言一、Docker 日志驱动二、ELK 套件部署三、Docker 容器日志采集3.1 部署 Filebeat3.2 配置 Filebeat3.3 验证采集数据3.4 Kibana 数据展示3.4.1 创建索引模式3.4.2 Kibana 查看日志 总结 前言 如何查看/管理 Docker 运行容器的日志&#xff1f;…

Gorsonpy的计算器

Gorsonpy的计算器 0.页面及功能展示1. PSP表格2.解题思路描述3.设计实现过程4.程序性能改进5.异常处理6.单元测试展示7.心路历程和收获 这个作业属于哪个课程https://bbs.csdn.net/forums/ssynkqtd-05这个作业要求在哪里https://bbs.csdn.net/topics/617294583这个作业的目标完…

【CVPR 2023】DSVT: Dynamic Sparse Voxel Transformer with Rotated Sets

文章目录 开场白效果意图 重点VoxelNet: End-to-End Learning for Point Cloud Based 3D Object DetectionX-Axis DSVT LayerY-Axis DSVT Layer Dynamic Sparse Window AttentionDynamic set partitionRotated set attention for intra-window feature propagation.Hybrid wind…

Seata详解

前言 ​ 随着互联网技术的不断发展&#xff0c;系统越来越复杂&#xff0c;几乎所有 IT 公司的系统都已经完成从单体架构到分布式架构的转变&#xff0c;分布式系统几乎无处不在&#xff0c;分布式事务由此产生。 事务 ​ 事务是应用程序中一系列严密的操作&#xff0c;所有…

283. 多边形,《算法竞赛进阶指南》,

283. 多边形 - AcWing题库 “多边形游戏”是一款单人益智游戏。 游戏开始时&#xff0c;给定玩家一个具有 N 个顶点 N 条边&#xff08;编号 1∼N&#xff09;的多边形&#xff0c;如图 1 所示&#xff0c;其中 N4 每个顶点上写有一个整数&#xff0c;每个边上标有一个运算符…

2023年中国金刚石工具产量、需求量、市场规模及行业细分产品规模[图]

金刚石工具就是以金刚石为增强体&#xff0c;以金属或聚合物为基体的一类功能复合材料。金刚石工具已经成为当今公认的、唯一有效的硬脆非金属材料加工工具&#xff0c;比如&#xff0c;只有用金刚石刀具能加工超硬的陶瓷&#xff0c;尚无其他代用品。金刚石工具根据其用途的不…

NeurIPS 2023 放榜!3200多篇上榜,录用率26.1%

上周机器学习顶会NeurIPS 2023的接收论文列表公布了&#xff0c;有同学的论文中了嘛&#xff0c;可以评论区分享分享。 这次NeurIPS 2023共录用论文3221篇左右&#xff0c;录用率26.1%&#xff0c;与2022年的25.6%相比还是有所增加的。有想法的同学冲冲冲。 NeurIPS属于CCF A…

C++ 并发编程实战 第八章 设计并发代码 二

目录 8.3 设计数据结构以提升多线程程序的性能 8.3.1 针对复杂操作的数据划分 8.3.2 其他数据结构的访问模式 8.4 设计并发代码时要额外考虑的因素 8.4.1 并行算法代码中的异常安全 8.4.2 可扩展性和Amdahl定律 8.4.3 利用多线程隐藏等待行为 8.4.4 借并发特性改进响应…

ELK整合springboot(第二课)

一、创建一个springboot的项目 pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…

Uniapp小程序 时间段选择限制(开始时间 结束时间相互限制)

实现效果&#xff1a; 这里我使用的是uview2.0的DatetimePicker 选择器&#xff0c;实现开始时间与结束时间相互限制的效果&#xff0c;接下来简单看下实现的代码吧&#xff0c;首先看下选择器组件以及相关参数值的初始化 <!-- 时间选择-开始 --> <u-datetime-picker …

【前段基础入门之】=>你不知道的 CSS 选择器的进阶使用!

导语&#xff1a; 在上一章节中&#xff0c;我们了解了 CSS 的一些基本语法概念&#xff0c;那么在这一章节中我们就带来 CSS 选择器知识的分享&#xff0c;选择器这一章的知识点有一点多&#xff0c;不过我们只要认真去理解&#xff0c;学习它也是没什么问题的&#xff0c;还有…

PowerShell 命令窗口执行 pnpm 命令报错 无法加载文件 pnpm.ps1,因为在此系统上禁止运行脚本

目录 问题解决验证附&#xff1a;开源项目微服务商城项目前后端分离项目 问题 在 PowerShell 命令行窗口使用 pnpm run dev 启动 vue3-element-admin 报错&#xff1a; pnpm : 无法加载文件 C:\Users\youlai\AppData\Roaming\npm\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚…

【kubernetes】kubernetes中的Ingress使用

文章目录 1 Service和Endpoint1.1 服务的转发1.2 headless service及其使用场景1.3 服务的类型 2 Ingress3 ingress controller4 IngressClass5 nginx-ingress-controller 1 Service和Endpoint k8s中运行的最小单位是Pod&#xff0c;如果单独运行Pod&#xff0c;没有用控制器进…

假期get新技能?低代码模型应用工具HuggingFists

HuggingFists是什么&#xff1f; HuggingFists是一款研究和使用HuggingFace模型和数据集的AI应用工具。 众所周知&#xff0c;Hugging Face是一家人工智能&#xff08;AI&#xff09;技术公司&#xff0c;致力于开发和推广自然语言处理&#xff08;NLP&#xff09;技术&#xf…

工信部:杭州亚运会开幕式首创 5G 超密组网方案,场馆网络无缝覆盖

“工信 V 报”今日发布消息称&#xff0c;工信部经过精心统筹、周密部署&#xff0c;举全系统之力圆满完成了杭州亚运会开幕式各项保障任务。 据介绍&#xff0c;亚运会的指挥调度、安全保卫、通信网络、计时记分、电视转播等系统顺畅运行&#xff0c;对无线电安全、信息通信服…