写一个方法实现“基数排序算法”,并解释下时间复杂度和空间复杂度

news/2024/11/30 9:31:12/文章来源:https://www.cnblogs.com/ai888/p/18578041
function radixSort(arr) {if (!Array.isArray(arr) || arr.length <= 1) {return arr;}// 1. 找到数组中的最大值,以确定最大位数let max = Math.max(...arr);let exp = 1; // 1, 10, 100...// 2. 循环执行计数排序,从个位到最高位while (max / exp >= 1) {arr = countingSort(arr, exp);exp *= 10;}return arr;
}function countingSort(arr, exp) {let n = arr.length;let output = new Array(n);let count = new Array(10).fill(0); // 0-9 十个桶// 3. 统计每个桶中元素的数量for (let i = 0; i < n; i++) {let digit = Math.floor(arr[i] / exp) % 10;count[digit]++;}// 4. 计算每个桶的结束索引for (let i = 1; i < 10; i++) {count[i] += count[i - 1];}// 5. 将元素放入输出数组中for (let i = n - 1; i >= 0; i--) {let digit = Math.floor(arr[i] / exp) % 10;output[count[digit] - 1] = arr[i];count[digit]--;}// 6. 将排序后的数组复制回原数组return output;
}// 示例用法:
let arr = [170, 45, 75, 90, 802, 24, 2, 66];
let sortedArr = radixSort(arr);
console.log(sortedArr); // [2, 24, 45, 66, 75, 90, 170, 802]

时间复杂度:

基数排序的时间复杂度为 O(nk),其中 n 是数组的长度,k 是最大数的位数。在计数排序部分,我们遍历数组两次,所以是 O(n)。由于我们需要对每一位都执行一次计数排序,所以总的时间复杂度是 O(nk)。

  • 如果 k 相对于 n 来说很小(例如,k 是常数或 log n),那么基数排序的时间复杂度可以近似为 O(n),使其成为一种线性时间排序算法。
  • 但是,如果 k 很大(例如,k 比 n 大得多),那么基数排序的性能可能会下降。

空间复杂度:

基数排序的空间复杂度为 O(n+k)。计数排序需要一个大小为 k 的计数数组和一个大小为 n 的输出数组。因此,总的空间复杂度为 O(n+k)。由于 k 通常比 n 小得多,所以空间复杂度可以近似为 O(n)。

前端开发中的应用场景:

虽然基数排序在前端开发中不如快速排序、归并排序或内置的 Array.prototype.sort() 常用,但在特定情况下,它仍然可以是一个不错的选择:

  • 排序非负整数: 基数排序最适合排序非负整数。如果你的数据是由非负整数组成,并且最大值的位数相对较小,那么基数排序可能比其他排序算法更高效。
  • 排序字符串: 可以将字符串转换为数字(例如,ASCII 码)后使用基数排序。
  • 自定义排序规则: 可以根据特定需求修改基数排序,例如按字符串的长度或其他自定义规则进行排序。

与其他排序算法的比较:

  • 快速排序/归并排序: 通常情况下,快速排序和归并排序是更通用的选择,平均时间复杂度为 O(n log n)。
  • 计数排序: 计数排序适用于排序范围较小的整数,时间复杂度为 O(n+k),其中 k 是排序范围。基数排序可以看作是多次应用计数排序。

总而言之,基数排序是一种高效的排序算法,尤其适用于排序非负整数。在特定情况下,它可能比其他排序算法更高效。 理解其时间和空间复杂度可以帮助你在前端开发中做出明智的算法选择。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研打卡(31)

开局(31) 开始时间 2024-11-30 08:23:52 结束时间 2024-11-30 09:24:35睡醒了。睡了六个小时睡不着了数据结构若一个有向图中的顶点不能排成一个拓扑序列,则可断定该有向图______(武汉科技大学 2013年) A 是个有根有向图 B 是个强连通图 C 含有多个入度为0的顶点 D 含有顶…

HTML5图像相关的标签有哪些?

HTML5 中与图像相关的标签主要有以下几个:<img> (Image): 这是最常用的图像标签,用于在网页上嵌入图像。它是一个自关闭标签,意味着它不需要结束标签 </img>。<picture> (Picture): <picture> 元素允许你定义多个图像源,浏览器会根据不同的设备特…

2024-2025-1 20241305 《计算机基础与程序设计》第十周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十周作业(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276))这个作业…

永硕网盘装修代码

查看代码<script> var num=2, rq_x=500, rq_d=800; var theme="3", linkstyle="0", colorbg="1"; var wfg="#FFF"; var music = [1433562661,1476239783,452804061,418602088,489768079,1478190629,1472951595,446944028,419374…

读数据质量管理:数据可靠性与数据质量问题解决之道19数据未来

数据未来1. 开创可靠数据系统的未来 1.1. 数据作为一个行业很可能正在经历一场巨大且不可逆转的巨变 1.2. 分析型数据正变成现代企业最关键和最具竞争力的核心资产1.2.1. 不再是公司是否依赖数据的问题1.2.2. 是使用多少数据以及将数据用于什么场景的问题1.3. 仅仅收集更多数据…

Linux之内存优化

虚拟内存与物理内存 计算机系统把内存组织成固定大小的页( page),页的大小是基于处理器架构的,例如在 x86_64 上标准的页为 4K。物理内存被划分为页帧(frames),一个页帧包含一页数据。 进程不会直接寻址物理内存,每个进程都有一个虚拟地址空间,当进程请求内存时,内核通过…

Linux之性能调优

什么是性能调优? 性能调优是调整系统设置以提高计算资源利用率,数据吞吐量和用户体验的过程。它需要非常了解系统的硬件和软件组件,以及系统之间的许多交互。性能调优有时也被称为“黑色艺术”。 性能调优经常与故障排查相混淆。但两者有很多区别。在做故障诊断时,主要目标…

企业级数据安全-CDH集群-dolphinscheduler海豚调度一站式数据安全技术实战2025

2024-11 月 测试环境 上 kerberos 认证1.1 修改 拷贝机器的IP地址, 改成和测试环境 5台机器一样的 IP映射,vim /etc/hosts 改成如下:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain…

STMcubeMX 使用(一)

今天给大家介绍一个STMcubeMX的简单实用案例,让大家对这个工具的使用有一点直观的感受。 前提是你已经安装好了自己开发板需要使用的package。 第一步:打开我们已经安装好的STMcubeMX软件现在最新版本的STMcubeMX界面可以通过多个方式开始新建一个项目。 第二步,我们从MCU型…

OpenVZ 9.0 - 基于容器的 Linux 开源虚拟化解决方案

OpenVZ 9.0 - 基于容器的 Linux 开源虚拟化解决方案OpenVZ 9.0 - 基于容器的 Linux 开源虚拟化解决方案 Open source container-based virtualization for Linux 请访问原文链接:https://sysin.org/blog/openvz-9/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…

Virtuozzo Hybrid Server 9.0 - 容器、计算和存储虚拟化平台

Virtuozzo Hybrid Server 9.0 - 容器、计算和存储虚拟化平台Virtuozzo Hybrid Server 9.0 - 容器、计算和存储虚拟化平台 The VMware alternative for service providers and enterprises 请访问原文链接:https://sysin.org/blog/virtuozzo-hybrid-server-9/ 查看最新版。原创…

语言能打败数值回归吗?基于语言的多模态轨迹预测

语言能打败数值回归吗?基于语言的多模态轨迹预测语言模型在语境理解和生成表现方面表现出了令人印象深刻的能力。受语言基础模型最近成功的启发,提出了LMTraj(基于语言的多模态轨迹预测器),它将轨迹预测任务转化为一种问答问题。与将轨迹坐标序列视为连续信号的传统数值回…