【数据结构详解】——计数排序(动图详解)

devtools/2024/9/24 2:17:54/

目录

  • 🕒 1. 计数排序

🕒 1. 计数排序

💡 算法思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,操作步骤:

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中

请添加图片描述

void CountSort(int* a, int n)
{assert(a);  // 创建计数数组,数组大小为原数组中最大值-最小值+1int max = a[0], min = a[0];int i = 0;for (i = 0; i < n; i++){if (a[i] > max)  {max = a[i];}if (a[i] < min)  {min = a[i];}}int range = max - min + 1;// 统计次数int* count = (int*)malloc(sizeof(int) * range);assert(count);// 初始化计数数组为0memset(count, 0, sizeof(int) * range);// 统计每个值出现的次数for (i = 0; i < n; i++){count[a[i] - min]++;}// 根据计数数组进行排序int j = 0;for (i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;  // 将排序后的值放回原数组}}free(count);count = NULL;  
}

注意:计数排序在排负数时,可将负数的类型转化成 unsigned int

只适合整数,不适合浮点数、字符串等。 数组中元素有正有负的情况时不适用计数排序。

计数排序的特性总结:

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

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页


http://www.ppmy.cn/devtools/94563.html

相关文章

Qt 小功能:加载等待动画——转圈圈

加载等待动画实现——转圈圈 效果图&#xff1a;&#xff08;看封面最好&#xff09; 关键要点 流畅的动画&#xff1a; 使用 QTimer 每 50 毫秒更新一次动画&#xff0c;确保动画流畅。 视觉效果&#xff1a; 使用 QPainter 的平滑像素转换和抗锯齿选项&#xff0c;提高动画…

高级网络渗透测试技术(第一篇)

一、概述 网络渗透测试&#xff08;Penetration Testing, Pen Test&#xff09;是通过模拟恶意攻击者的行为来评估计算机系统、网络或Web应用的安全性。高级网络渗透测试技术则涵盖了更复杂和深入的测试方法&#xff0c;能够更有效地发现并利用系统中的潜在漏洞。 二、前期准…

iframe 通信的三种方式(重点介绍postMessage)

概述&#xff1a;在网页开发中&#xff0c;iframe 是一种常用于嵌入另一个 HTML 文档到当前文档中的元素。由于安全原因&#xff0c;iframe 中的文档默认与父文档隔离&#xff0c;但有时候我们需要在 iframe 和其父页面&#xff08;或不同 iframe 之间&#xff09;进行通信。有…

探索Intel Agilex系列FPGA:创新驱动的高性能计算解决方案

1. 引言 在这个数字化时代&#xff0c;高性能计算已经成为许多领域的关键需求。从科学研究到人工智能&#xff0c;从数据中心到通信领域&#xff0c;提供强大的计算和数据处理能力是推动创新和技术进步的关键。在这样的背景下&#xff0c;Intel推出了Agilex系列FPGA&a…

spring boot入门案例

一、案例需求 请求Controller中的方法&#xff0c;并将返回值响应到页面 二、代码实现 1.依赖管理——pom.xml文件 &#xff08;1&#xff09;引入 &#xff08;2&#xff09;引入依赖集合 &#xff08;3&#xff09;引入插件&#xff1a;为了方便运行&#xff0c;将project…

深入理解 Python 的 `asyncio` 库:实现异步编程的实用指南

深入理解 Python 的 asyncio 库:实现异步编程的实用指南 在现代软件开发中,异步编程已成为处理 I/O 密集型任务的关键技术。Python 的 asyncio 库为开发者提供了一种高效的方式来编写异步代码。本文将深入探讨 asyncio 的基本概念、使用方法以及一些实用示例,帮助您掌握异步…

深度解析:NPM、PNPM、Yarn 包管理工具的介绍与对比

在前端开发中&#xff0c;包管理工具是不可或缺的一部分&#xff0c;它们帮助我们轻松管理项目依赖、发布和共享代码。NPM、PNPM、Yarn 是目前最流行的包管理工具&#xff0c;但它们各有特点和使用场景。本文将深入解析这三大包管理工具&#xff0c;帮助你选择最适合自己项目的…

vue3 中捕获全局和组件错误

全局的错误捕获与处理 在main.js或main.ts中使用 app.config.errorHandler来定义全局错误处理器。这个钩子接受三个参数错误对象、出错的组件实例以及错误信息。 示例代码 import { createApp } from vue; import App from ./App.vue;const app createApp(App);//vue3全局错…