JS实现堆排序

堆排序(Heap Sort)作为一种高效的排序算法,具有稳定的性能和卓越的时间复杂度。本文将深入研究堆排序的原理、实现方式等。

什么是堆排序

公众号:Code程序人生,个人网站:https://creatorblog.cn

堆排序是一种基于二叉堆数据结构的排序算法。二叉堆是一种特殊的树形数据结构,分为最大堆和最小堆,其中最大堆的每个节点的值都大于等于其子节点的值。

堆排序通过构建最大堆,将最大元素与数组末尾元素交换并将其排除,然后对剩余元素重新构建最大堆,如此循环直至整个数组有序。

如何实现堆排序

以下是一个基于 JavaScript 的堆排序实现:

// 堆排序函数
function heapSort(arr) {// 构建最大堆buildMaxHeap(arr);// 交换堆顶元素与末尾元素,然后重新调整堆for (let i = arr.length - 1; i > 0; i--) {[arr[0], arr[i]] = [arr[i], arr[0]];heapify(arr, 0, i);}return arr;
}// 构建最大堆
function buildMaxHeap(arr) {const n = arr.length;for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {heapify(arr, i, n);}
}// 调整堆
function heapify(arr, i, n) {let largest = i;const left = 2 * i + 1;const right = 2 * i + 2;if (left < n && arr[left] > arr[largest]) {largest = left;}if (right < n && arr[right] > arr[largest]) {largest = right;}if (largest !== i) {[arr[i], arr[largest]] = [arr[largest], arr[i]];heapify(arr, largest, n);}
}// 示例
const unsortedArray = [64, 25, 12, 22, 11];
const sortedArray = heapSort(unsortedArray);
console.log(sortedArray); // 输出 [11, 12, 22, 25, 64]

堆排序的实现原理

  1. 构建最大堆: 从数组构建最大堆,确保每个父节点的值都大于等于其子节点。
  2. 交换与调整: 将最大堆的堆顶元素(最大值)与数组末尾元素交换,并将交换后的数组重新调整为最大堆。
  3. 重复操作: 重复以上步骤,直至整个数组有序。

通过不断交换堆顶元素与数组末尾元素,堆排序能够实现对整个数组的排序。

时间复杂度和空间复杂度

堆排序的时间复杂度相对较低,且具备原地排序的优势。

时间复杂度

堆排序的时间复杂度是O(n log n),其中n是数组的长度。这是由于构建最大堆和每次调整堆的复杂度都是O(log n)

空间复杂度

堆排序是一种原地排序算法,不需要额外的空间来存储临时数据,因此其空间复杂度为O(1)

总结

堆排序是一种高效且稳定的排序算法,通过构建最大堆和不断交换堆顶元素实现对整个数组的排序。

尽管其实现相对较复杂,但其时间复杂度的优越性使得堆排序在实际应用中表现出色。在处理大规模数据时,堆排序是一个强有力的选择。

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

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

相关文章

按升序输出各个字符串。

编写程序&#xff0c;设计并实现如下功能&#xff1a;从键盘输入多个字符串&#xff0c;按升序输出各个字符串。

从零开始搭建博客网站-----框架页

实现效果如下 发布的功能还没有实现&#xff0c;仅仅实现了简单的页面显示 关键代码如下 <template><div class"layout"><el-header class"header"><div class"logo">EasyBlog</div></el-header><el-c…

Python标准库:copy模块【侯小啾python基础领航计划 系列(十五)】

Python标准库:copy模块【侯小啾python基础领航计划 系列(十五)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

YOLOv8改进有效涨点 | 2023 | SPD-Conv空间深度转换卷积(高效空间编码技术)

一、本文介绍 本文给大家带来的改进内容是SPD-Conv&#xff08;空间深度转换卷积&#xff09;技术。SPD-Conv是一种创新的空间编码技术&#xff0c;它通过更有效地处理图像数据来改善深度学习模型的表现。SPD-Conv的基本概念&#xff1a;它是一种将图像空间信息转换为深度信息…

springboot的常用注解

声明解释这个对象&#xff08;类或者其他&#xff09;组件相关 名称作用Controller用于修饰MVC中controller层的组件SpringBoot中的组件扫描功能会识别到该注解&#xff0c;并为修饰的类实例化对象&#xff0c;通常与RequestMapping联用&#xff0c;当SpringMVC获取到请求时会…

Android多用户初探

参考博文:Android UserManagerService初始化_qluka的博客-CSDN博客 想限制多用户的行为,但是不知默认配置在哪?所以写写。 默认guest用户被限制的行为: ./frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.javaprivate static Bundle getDefaul…

国产API调试插件:Apipost-Helper

前言 Idea 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展&#xff0c;可以根据开发人员的需要进行定制和扩展&#xff0c;从而提高开发效率,今天我们就来介绍一款…

git 提交时忽略eslint检查

git commit -m “” –no-verify

Halcon深度学习药片检测

1.应用示例思路 (1) 标注数据并获取halcon字典形式的训练数据&#xff1b;(2) 数据预处理&#xff1b; (3) 模型训练&#xff1b;(4) 模型评估和验证&#xff1b;(5) 模型推理。 数据的标注使用labelimg工具&#xff0c;具体的参考以下博文&#xff1a; https://blog.csdn.…

笔记-模拟角频率和数字角频率的关系理解

先建议阅读前人此文&#xff08;点击这里&#xff09;&#xff0c;有助于理解。 模拟频率&#xff1a;f 模拟角频率&#xff1a;Ω 数字角频率&#xff1a;ω 其中&#xff1a;在模拟信号中Ω 2πf 正弦波表示&#xff1a;sin(2πft) sin(Ωt) 数字信号就是离散的&#xff…

深度学习(五):pytorch迁移学习之resnet50

1.迁移学习 迁移学习是一种机器学习方法&#xff0c;它通过将已经在一个任务上学习到的知识应用到另一个相关任务上&#xff0c;来改善模型的性能。迁移学习可以解决数据不足或标注困难的问题&#xff0c;同时可以加快模型的训练速度。 迁移学习的核心思想是将源领域的知识迁…

出现数据库出现没有时间格式的错误,实体类Date类型不对导致时间报错

目录 报错现场解决办法java与mysql中的日期类型及二者的对应关系和使用场景 报错现场 数据库最早时间为2023年1月1日&#xff0c;前端查询后却出现2022年12月31日的数据 数据库时间类型为date swagger接口测试 解决办法 讲until的Date改成sql类的Date&#xff0c;就可以了…

[ 蓝桥杯Web真题 ]-视频弹幕

目录 介绍 准备 目标 效果 规定 思路 解答参考 扩展功能 介绍 弹幕指直接显现在视频上的评论&#xff0c;可以以滚动、停留甚至更多动作特效方式出现在视频上&#xff0c;是观看视频的人发送的简短评论。通过发送弹幕可以给观众一种“实时互动”的错觉&#xff0c;弹幕…

基于STM32的智慧农业项目(物联网专业毕设)附送源码和文档材料+学习路线

文章目录 概要整体架构流程硬件选型软件总体框架技术细节实现效果小结 概要 传统农业存在着产量受到环境因素影响较大的问题&#xff0c;现有的农业监测系统数据太过简单、太过理想化。而随着现代科学的持续发展,一个精准化、自动化的现代智能农产品管理系统将在农业生产中起着…

个人Windows电脑通过Cloudreve+Cpolar搭建PHP云盘系统公网可访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

⭐ Unity + ARKIT 介绍 以及 平面检测的实现

在AR插件中&#xff0c;ARKIT是比较特殊的一个&#xff0c;首先他在很多追踪上的效果要比其他的AR插件要好&#xff0c;但是只能在IOS系统设备上运行。 1.首先ARKIT在最新版Unity已经集成在AR Foundation中&#xff0c;那我们就需要ARSession 和ARSessionOrigin这两个重要组件…

【DevOps】Jenkins:配置jenkins 流水线/多分支流水线任务构建成功通知企业微信@相关人(二)

目录 一、调用Kubernetes API二、打包编译三、应用于流水线上一篇文章实现了企业微信通知,但仅仅是Jenkins构建后通知,如果在K8s侧配置了就绪检测和滚动更新,那构建完成并不能代表服务已经发布完成,本篇文章我们就来解决这个问题 一、调用Kubernetes API 我这里使用Golan…

[Ubuntu 20.04] 使用Netplan配置网络静态IP

Netplan 是一个在 Ubuntu 系统中进行网络配置的工具。它提供了一种简单和统一的方式来管理网络配置,包括网络接口、IP 地址、网关、DNS 设置等。 以下是 Netplan 的特点和功能: 声明性配置: Netplan 使用 YAML 文件格式进行网络配置,这使得配置文件更易于阅读和编写。你可以…

netcore swagger 错误 Failed to load API definition

后端接口报错如下&#xff1a; 前端nswag报错如下&#xff1a; 根据网上查询到的资料说明&#xff0c;说一般swagger这种错误都是控制器里有接口代码异常造成的&#xff0c;通常是接口没有加属性Attribute&#xff0c; 比如[HttpPost("Delete")]、[HttpGet("Del…

chown和chmod

chown和chmod都是在Linux和Unix系统中用于设置文件和文件夹权限的命令&#xff0c;但它们的功能和用途有所不同。 功能&#xff1a;chown主要用于修改文件或文件夹的所有者和所属组&#xff0c;而chmod则主要用于修改文件或文件夹的读写执行权限。用途&#xff1a;如果想要授权…