排序算法--堆排序
基本思想
堆排序的基本思想是,将待排序的元素构建成一个最大堆或最小堆。对于最大堆来说,堆顶是整个堆中的最大元素;对于最小堆来说,堆顶是整个堆中的最小元素。然后,将堆顶元素与堆中最后一个元素交换,并从堆中移除这个最大或最小元素,再调整剩余的堆,使其满足堆的性质。这个过程重复进行,直到堆中只剩下一个元素,此时数组就被排序了。
算法步骤
- 构建最大堆:将待排序的数组从最后一个非叶子节点开始不断向前使用
向下调整,使之成为一个最大堆。 - 交换堆顶元素与堆尾元素:将堆顶元素(最大值)与堆中最后一个元素交换,此时最后一个元素即为最大值,放置在数组的正确位置。
- 调整堆:交换后的堆可能不满足最大堆的性质,因此需要从堆顶开始重新调整堆。
- 重复步骤2和3:重复上述过程,每次都会将最大的元素放置在数组的正确位置,直至数组完全有序。
示例代码(从小到大)
建堆有向上调整建堆和向下调整建堆两种,使用向上调整建堆的时间复杂度为O(nlogn),而向下调整建堆的时间复杂度为O(n),所以我们选择向下调整建堆(向下调整详细请看我发布的堆博客)
向下调整
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
void AdjustDown(HPDataType* a, int n, int parent)//n为a数组元素个数
{int child = (parent * 2) + 1; // 左子节点位置(假设法找大孩子)while (child < n) // 如果有左子节点,进行循环{if (a[child] < a[child + 1] && child + 1 < n) // 如果右子节点比左子节点大且右子节点存在child++; // 右子节点作为比较对象(大孩子)if (a[child] > a[parent]) // 如果子节点比父节点大{Swap(&a[child], &a[parent]); // 交换子节点和父节点的值parent = child; // 更新父节点位置child = (parent * 2) + 1; // 更新子节点位置}else{break; // 如果子节点比父节点小,则跳出循环}}
}
建大堆并排序
// 堆排序
void HeapSort(int* a, int n)//n为a数组元素个数
{// 建大堆for (int i = (n - 2) / 2; i >= 0; i--){AdjustDown(a, n, i); // 向下调整堆}// 排序for (int i = n - 1; i > 0; i--){Swap(&a[i], &a[0]); // 交换堆顶元素和最后一个元素,则最后一个元素为最大的元素AdjustDown(a, i, 0); // 向下调整堆,让堆顶变为最大数}
}
时间复杂度
堆排序的时间复杂度是O(nlogn)。构建最大堆的时间复杂度是O(n),每次调整堆的时间复杂度是O(logn),由于需要调整n-1次,所以总的时间复杂度为O(nlogn)。
空间复杂度
堆排序的空间复杂度是O(1)。它是在原地进行排序的,不需要额外的存储空间。
优点
- 性能稳定:堆排序的时间复杂度在最好、最坏和平均情况下都是O(nlogn),因此性能稳定。
- 空间效率高:由于是原地排序算法,不需要额外的内存空间。
缺点
- 实现复杂:相对于冒泡排序、插入排序等简单排序算法,堆排序的实现相对复杂。
- 不稳定性:堆排序不是一个稳定的排序算法,相等的元素可能在排序过程中改变它们的相对顺序。
总结来说,堆排序是一种高效、稳定的排序算法,适用于大规模数据的排序,尽管它的实现较为复杂。在实际应用中,堆排序常用于需要性能稳定且空间复杂度低的场景。
相关文章:
排序算法--堆排序
基本思想 堆排序的基本思想是,将待排序的元素构建成一个最大堆或最小堆。对于最大堆来说,堆顶是整个堆中的最大元素;对于最小堆来说,堆顶是整个堆中的最小元素。然后,将堆顶元素与堆中最后一个元素交换,并…...
iPhone 在 App Store 中推出的 PC 模拟器 UTM SE
PC 模拟器是什么?PC 模拟器是一种软件工具,它模拟不同硬件或操作系统环境,使得用户可以在一台 PC 上运行其他平台的应用程序或操作系统。通过 PC 模拟器,用户可以在 Windows 电脑上体验 Android 应用、在 Mac 电脑上运行 Windows …...
FastAPI删除mongodb重复数据(数据清洗)
在 FastAPI 中删除 MongoDB 重复数据,你需要结合使用 MongoDB 查询和 FastAPI 的路由功能。以下是一个通用的例子,演示如何删除特定字段上的重复数据: 1. 定义数据模型: from pydantic import BaseModel, Field from bson import ObjectId …...
移动UI:排行榜单页面如何设计,从这五点入手,附示例。
移动UI的排行榜单页面设计需要考虑以下几个方面: 1. 页面布局: 排行榜单页面的布局应该清晰明了,可以采用列表的形式展示排行榜内容,同时考虑到移动设备的屏幕大小,应该设计合理的滚动和分页机制,确保用户…...
如何解决 uni-app 项目中 “文件查找失败:‘crypto-js‘“ 的问题
在开发使用 uni-app 框架的项目时,遇到依赖问题是常见的。本文将介绍如何解决编译过程中出现的 “文件查找失败:‘crypto-js’” 错误,并说明这种错误为什么会发生以及如何避免。 问题背景 在对 uni-app 项目进行编译时,我们可能…...
Apache DolphinScheduler 3.2.2 版本正式发布!
Apache DolphinScheduler 3.2.2 版本正式发布! 近日,Apache DolphinScheduler 发布了 3.2.2 版本。此版本主要基于 3.2.1 版本进行了 bug 修复,新增若干特性,并进行了众多改进和 Bug 修复,以及文档修复等。 …...
汇川CodeSysPLC教程03-2-6 ModBus TCP
什么是ModBus TCP? ModBus TCP是一种基于TCP/IP协议的工业网络通信协议,常用于工业自动化和控制系统。它是ModBus协议的一个变种,ModBus协议最初由Modicon(现在是施耐德电气的一部分)在1979年开发。 以下是ModBus TC…...
【Python机器学习】决策树的构造——划分数据集
分类算法除了需要测量信息熵,还需要划分数据集,度量划分数据集的熵,以便判断当前是否正确划分了数据集。 我们将对每个特征划分数据集的结果计算一次信息熵,然后判断按照哪个特征划分数据集是最好的划分方式。 想象一个分部在二…...
Pip换源使用帮助
PyPI 镜像使用帮助 PyPI 镜像帮助提高包安装的速度,特别是当默认源访问较慢时。镜像每次同步成功后,每隔 5 分钟进行更新,确保镜像内容尽量与官方源保持一致。 pip 临时使用 如果您只想在一次安装中使用镜像,可以使用以下命令&…...
力扣1089复写0
1089. 复写零 - 力扣(LeetCode) 我们的思路是利用类似双指针的方式去解答,来看下代码 class Solution { public:void duplicateZeros(vector<int>& arr){int cur 0, dest -1, n arr.size();while (cur < n){if (arr[cur])d…...
10 VUE Element
文章目录 VUE1、概述2、快速入门3、Vue 指令4、生命周期5、案例 Elemant1、快速入门2、Element 布局3、常用组件-案例 VUE 1、概述 Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写基于MVVM(Model-View-ViewModel)思想,实现数据…...
独立游戏《星尘异变》UE5 C++程序开发日志8——实现敏感词过滤功能(AC自动机)
在游戏中经常会有需要玩家输入一些内容的功能,例如聊天,命名等,这款游戏只有在存档时辉用到命名功能,所以这个过滤也只是一个实验性的功能,我们将使用AC自动机来实现,这是在我们把“csdn”这个词设置为屏蔽…...
使用 Swagger 在 Golang 中进行 API 文档生成
Swagger 是一款强大的 API 文档生成工具,可以帮助开发者轻松创建、管理和展示 RESTful API 文档。在本文中,我们将介绍如何在 Golang 项目中使用 Swagger 来生成 API 文档。 官网地址 : gin-swagger 前提条件 Golang 开发环境(…...
Pip换源实战指南:加速你的Python开发
1. Pip换源的重要性 在使用Python进行软件开发或数据分析时,pip 是Python的包管理工具,用于安装和管理第三方库。然而,由于网络环境的差异,特别是在某些国家,访问默认的PyPI(Python Package Indexÿ…...
【数据结构】常用数据结构的介绍:理解与应用
文章目录 前言一、介绍二、使用场景三、总结 前言 在计算机科学中,数据结构是我们组织和存储数据的方式,它可以帮助我们高效地执行各种操作,如搜索、插入和删除。从数组和链表,到树和图,不同的数据结构有着不同的优点…...
【优秀python系统毕设】基于Python flask的气象数据可视化系统设计与实现,有LSTM算法预测气温
第一章 绪论 1.1 研究背景 在当今信息爆炸的时代,气象数据作为重要的环境信息资源,扮演着关键的角色。然而,传统的气象数据呈现方式存在信息量庞大、难以理解的问题,限制了用户对气象信息的深入理解和利用。因此,基…...
【康复学习--LeetCode每日一题】2951. 找出峰值
题目: 给你一个下标从 0 开始的数组 mountain 。你的任务是找出数组 mountain 中的所有 峰值。 以数组形式返回给定数组中 峰值 的下标,顺序不限 。 注意: 峰值 是指一个严格大于其相邻元素的元素。 数组的第一个和最后一个元素 不 是峰值。…...
PYTHON学习笔记(八、字符串及的使用)
目录 1、字符串 1.1、字符串的常用操作 1.2、格式化字符串 1.2.1、占位符格式化字符串 1.2.2、f-string格式化字符串 1.2.3、str.format( )格式化字符串 1.3、数据的验证 1.4、正则表达式 1.5.1元字符 1.5.2限定符 1.5.3其他字符 1.5.4re模块 1、字符串 1.1、字符…...
文件共享功能无法使用提示错误代码0x80004005【笔记】
环境情况: 其他电脑可以正常访问共享端,但有一台电脑访问提示错误代码0x80004005。 处理检查: 搜索里输入“启用或关闭Windows功能”按回车键,在“启用或关闭Windows功能”里将“SMB 1.0/CIFS文件共享支持”勾选后(故…...
FTP(File Transfer Protocal,文件传输协议)
文章目录 引言FTP管理工具FTP客户端FTP连接模式控制连接数据连接FTP命令/响应FTP命令FTP响应FTPSSFTP引言 FTP(File Transfer Protocal,文件传输协议)用于建立两台主机间的数据文件传输下载。使用客户/服务器(Client/Server)架构,基于TCP协议,服务端口为21。 FTP链接…...
从序列到功能:如何用MEME+MAST发现蛋白基序的隐藏规律(含UniProt验证技巧)
从序列到功能:如何用MEMEMAST发现蛋白基序的隐藏规律(含UniProt验证技巧) 在蛋白质组学研究中,保守基序(motif)往往承载着关键的功能密码。当我们在MEME中完成初步预测后,如何从这些序列模式中挖…...
企业数字化转型的核心基础设施:组织人事信息管理系统
去年某制造企业 HR 负责人跟我抱怨:公司 800 多人,每次调整组织架构都要改十几个 Excel 表格,员工调岗要手动更新 5 个系统的数据,光是核对信息就要花 3 天时间。这不是个例,很多企业的人事管理还停留在表格时代&#…...
EVA-01部署教程:Qwen2.5-VL-7B模型服务API封装+NERV风格响应协议
EVA-01部署教程:Qwen2.5-VL-7B模型服务API封装NERV风格响应协议 1. 引言:欢迎来到NERV指挥中心 想象一下,你面前有一个能“看懂”图片的智能助手,但它不是普通的聊天窗口,而是一个充满未来感的机甲驾驶舱。紫色的装甲…...
从电网到实验室——10kW大功率电源的Psim仿真实战
基于Psim的Boost型 PFC移相全桥AC-DC电源设计仿真 1、前级电网输入220AC,50Hz,中间级母线电压为600V,后级600V输入,547V输出,电压可调,功率10kW 2、前级基于Boost电路PFC,平均电流控制ÿ…...
Anthropic提示工程教程:从入门到精通的完整指南
Anthropic提示工程教程:从入门到精通的完整指南 【免费下载链接】prompt-eng-interactive-tutorial Anthropics Interactive Prompt Engineering Tutorial 项目地址: https://gitcode.com/GitHub_Trending/pr/prompt-eng-interactive-tutorial Anthropic的交…...
MeetingBar AppleScript自动化:会议开始前自动暂停音乐的终极指南
MeetingBar AppleScript自动化:会议开始前自动暂停音乐的终极指南 【免费下载链接】MeetingBar 🇺🇦 Your meetings at your fingertips in the macOS menu bar 项目地址: https://gitcode.com/gh_mirrors/me/MeetingBar MeetingBar是…...
南北阁4.1-3B WebUI代码实例:TextIteratorStreamer多线程流式实现解析
南北阁4.1-3B WebUI代码实例:TextIteratorStreamer多线程流式实现解析 今天咱们来聊聊一个特别有意思的项目——一个为南北阁4.1-3B模型量身定做的Web交互界面。如果你用过Streamlit,可能会觉得它的界面有点“官方”,布局也比较固定。但这个…...
别再傻傻分不清了!IM和RTC到底差在哪?从微信聊天到腾讯会议的技术选择
IM与RTC技术选型指南:从协议栈到商业场景的深度解析 当你的产品经理在白板上画出一个"消息气泡"和一个"视频通话图标"时,技术团队首先需要面对的灵魂拷问是:这到底该用IM架构还是RTC架构?2019年某在线教育初创…...
Welch‘s t-test实战指南:从原理到Python实现
1. 为什么你需要Welchs t-test? 做数据分析时,经常会遇到这样的场景:你想比较两组数据的平均值是否有显著差异,但发现这两组数据的方差不一样,样本量也不同。这时候传统的Students t-test就不太适用了,因为…...
ApiPost实战指南:从接口创建到自动化测试的全流程解析
1. 从零开始创建你的第一个API接口 作为一个常年和API打交道的开发者,我深知新手第一次接触接口工具时的迷茫。ApiPost作为一款国产的API开发工具,用起来确实比Postman更顺手,特别是对中文用户特别友好。下面我就带你一步步创建第一个接口&am…...
