【C语言】排序算法 -------- 计数排序

在这里插入图片描述
个人主页
创作不易,感谢大家的关注!
在这里插入图片描述
在这里插入图片描述

文章目录

  • 1. 计数排序的概念
  • 2. 计数排序使用场景
  • 3. 计数排序思想
  • 4. 计数排序实现过程
  • 5. 计数排序的效率
  • 6. 总结(附源代码)

1. 计数排序的概念

计数排序是一种非比较的排序算法,其基本思想是统计待排序元素中小于等于每个元素的个数,从而确定每个元素的位置。

2. 计数排序使用场景

计数排序适用于以下几种情况:

  1. 数据的取值范围比较小,序列中最大值和最小值之间的差值不能过大,防止建立数组时造成内存浪费。
  2. 数据是整数类型,不能为浮点数类型。

3. 计数排序思想

计数排序的核心是:利用数组的索引是有序的前提下,通过将序列中的元素作为索引,其个数作为值放入数组,遍历数组来排序。

4. 计数排序实现过程

方法步骤如下:

  1. 先选出待排序序列中的最小数和最大数。
  2. 给出一个范围range,为 max-min+1。
  3. 创建一个count数组,大小为每个元素的大小。
  4. 遍历待排序数组,统计每个元素出现的次数,并将其存储在count数组中。
  5. 本质是利用count数组的自然序号排序。根据count数组中的元素,遍历依次更新待排序数组中的元素,实现排序。
  6. 统计count数组里的每个元素出现的次数,然后映射给tmp数组。(使用相对映射)
  7. 将tmp数组里不为0的元素的下标+min反赋给数组count,遍历结束,排序完成。

5. 计数排序的效率

时间复杂度:O(N+range),N为待排序序列的长度,range为max-min+1的大小。
空间复杂度:O(range)。
稳定性:稳定。

6. 总结(附源代码)

#define _CRT_SECURE_NO_WARNINGS 1

void PrintArray(int* a, int n);

void CountSort(int* a, int n);

void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}
//时间复杂度:O(N+range)
//只适合整数/适合范围集中
//空间复杂度:O(range)
void CountSort(int* a, int n)
{
	int min = a[0], max = a[0];
	for (int i = 1; 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*)calloc(range,sizeof(int));
	if (count == NULL)
	{
		perror("calloc fail");
		return;
	}
	// 统计次数
	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;
		}
	}
	free(count);
}

void TestSort()
{
	int a[] = { 6,1,2,9,4,2,4,1,4 };
	PrintArray(a, sizeof(a) / sizeof(int));
	CountSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

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

在这里插入图片描述
今天的分享就到这里啦,感谢大家的支持,我们下次再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二、交换机介绍及vlan原理

目录 一、交换机 1.1、交换机处理数据帧的三种行为 1.2、初始化通信 二、虚拟局域网&#xff08;VLAN&#xff09; 三、vlan间通信 3.1、子接口 3.2、三层交换机 一、交换机 交换机&#xff1a;隔离冲突域&#xff0c;交换机每个接口都有一个网卡&#…

解放代码:识别与消除循环依赖的实战指南

目录 一、对循环依赖的基本认识 &#xff08;一&#xff09;代码中形成循环依赖的说明 &#xff08;二&#xff09;无环依赖的原则 二、识别和消除循环依赖的方法 &#xff08;一&#xff09;使用JDepend识别循环依赖 使用 Maven 集成 JDepend 分析报告识别循环依赖 &a…

超越中心化:Web3如何塑造未来数字生态

随着技术的不断发展&#xff0c;人们对于网络和数字生态的期望也在不断提升。传统的中心化互联网模式虽然带来了便利&#xff0c;但也暴露出了诸多问题&#xff0c;比如数据滥用、信息泄露、权力集中等。在这样的背景下&#xff0c;Web3技术应运而生&#xff0c;旨在打破传统中…

Shopee API接口:获取搜索栏生成的商品结果列表

一、平台介绍 Shopee&#xff0c;作为东南亚领先的电商平台&#xff0c;一直致力于为卖家和买家提供便捷、高效的在线购物体验。为了满足广大开发者的需求&#xff0c;Shopee提供了丰富的API接口服务&#xff0c;帮助卖家和第三方开发者更好地与平台进行数据交互&#xff0c;实…

ucos抢占式实时多任务操作系统 (RTOS)。

介绍 uCOS (也称为 μC/OS 或 Micro-Controller Operating System) 是一个开源的、可移植的、可裁剪的、抢占式实时多任务操作系统 (RTOS)。它最初由 Jean J. Labrosse 编写&#xff0c;并广泛用于嵌入式系统设计中。uCOS 是一个小型的 RTOS&#xff0c;非常适合那些需要实时性…

区间预测 | Matlab实现CNN-ABKDE卷积神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现CNN-ABKDE卷积神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现CNN-ABKDE卷积神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-ABKDE卷积神经网络自适应…

基于深度学习网络的USB摄像头实时视频采集与人脸检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将摄像头对这播放视频的显示器&#xff0c;然后进行识别&#xff0c;识别结果如下&#xff1a; 本课题中&#xff0c;使用的USB摄像头为&#xff…

30.保存游戏配置到文件

上一个内容&#xff1a;29.添加录入注入信息界面 以 29.添加录入注入信息界面 它的代码为基础进行修改 效果图&#xff1a; 首先在我们辅助程序所在目录下创建一个ini文件 文件内容 然后首先编写一个获取辅助程序路径的代码 TCHAR FileModule[0x100]{};GetModuleFileName(NUL…

【教学类-12-12】20240617通义万相-动物图片6张编故事(A4一页4条)

背景需求 【教学类-12-11】20240612通义万相-动物图片连连看&#xff08;A4一页3套&#xff09;-CSDN博客文章浏览阅读891次&#xff0c;点赞34次&#xff0c;收藏11次。【教学类-12-11】20240612通义万相-动物图片连连看&#xff08;A4一页3套&#xff09;https://blog.csdn.n…

Web前端项目-拼图游戏【附源码】

拼图游戏 拼图游戏是一种经典的益智游戏&#xff0c;通过HTML、CSS和JavaScript等前端技术的综合运用来实现&#xff1b;拼图游戏可以锻炼玩家的观察能力、空间认知能力和逻辑思维能力。游戏开始时&#xff0c;一张图片会被切割成多个小块&#xff0c;并以随机顺序排列在游戏区…

【第三篇】SpringSecurity请求流程分析

简介 本篇文章主要分析一下SpringSecurity在系统启动的时候做了那些事情、第一次请求执行的流程是什么、以及SpringSecurity的认证流程是怎么样的,主要的过滤器有哪些? SpringSecurity初始化流程 1.加载配置文件web.xml 当Web服务启动的时候,会加载我们配置的web.xml文件…

你是否感受到AI就在身边?

人工智能&#xff08;AI&#xff09;是一项革命性的技术&#xff0c;旨在模仿人类智慧并执行通常需要人类认知能力的任务。它覆盖了多个子领域&#xff0c;如机器学习、自然语言处理、计算机视觉和机器人技术。AI系统设计用于分析大量数据、从模式中学习、做出预测&#xff0c;…

ue5创建地图瓦片

先在虚幻商城下载免费的paperzd插件&#xff0c;并启用。 导入资源后&#xff0c;先通过应用paper2d纹理资源&#xff0c;将去掉导入ue时产生的边缘模糊&#xff0c;再点击下面的创建瓦片集&#xff0c; 打开瓦片集&#xff0c;发现选中不对&#xff0c; 改变瓦片大小为16*…

Java——IO流(字符流,字节流)

JavaIO的整体框架图 IO流从方向上来说&#xff0c;可以分为输入流和输出流&#xff1b; 从传输内容上来说&#xff0c;可以分为字符流和字节流 防止记混的口诀 所谓的IO&#xff0c;说白了就是数据在内存和硬盘之间的传输 输入流 %Reader %InputStream&#xff0c;从硬盘写…

如何应对缺失值带来的分布变化?探索填充缺失值的最佳插补算法

本文将探讨了缺失值插补的不同方法&#xff0c;并比较了它们在复原数据真实分布方面的效果&#xff0c;处理插补是一个不确定性的问题&#xff0c;尤其是在样本量较小或数据复杂性高时的挑战&#xff0c;应选择能够适应数据分布变化并准确插补缺失值的方法。 我们假设存在一个…

华为----RIP- RIPv2的认证配置

8.2 配置RIPv2的认证 8.2.1 原理概述 配置协议的认证可以降低设备接受非法路由选择更新消息的可能性&#xff0c;也可称为“验证”。非法的更新消息可能来自试图破坏网络的攻击者&#xff0c;或试图通过欺骗路由器发送数据到错误的目的地址的方法来捕获数据包。RIPv2协议能够…

Pycharm社区版搭建Django环境及Django简单项目、操控mysql数据库

Web应用开发&#xff08;Django&#xff09; 一、配置Django环境 1、先通过Pycharm社区版创建一个普通的项目 2、依次点击”file"-->"Settings" 3、点击"Project:项目名"-"Python Interpreter"-"号" 4、在搜索框输入要安装的…

CSS选择符和可继承属性

属性选择符&#xff1a; 示例&#xff1a;a[target"_blank"] { text-decoration: none; }&#xff08;选择所有target"_blank"的<a>元素&#xff09; /* 选择所有具有class属性的h1元素 */ h1[class] { color: silver; } /* 选择所有具有hre…

渗透测试和红蓝对抗是什么?二者之间有何区别?

在网络安全这个庞大的体系中&#xff0c;渗透测试、红蓝对抗是比较常见的专业名词&#xff0c;承担着非常重要的作用&#xff0c;那么什么是渗透测试、红蓝对抗?红蓝对抗和渗透测试有什么区别?小编通过这篇文章为大家介绍一下。 渗透测试 渗透测试&#xff0c;是通过模拟黑…

Java基础 - 练习(一)打印等腰三角形

Java基础练习 打印等腰三角形&#xff0c;先上代码&#xff1a; public static void main(String[] args) {// 打印等腰三角形System.out.println("打印等腰三角形&#xff1a;");isoscelesTriangle(); } public static void isoscelesTriangle() {// for循环控制行…