当前位置: 首页 > news >正文

C++ 堆排序

C++ 堆排序

堆排序是一种基于二叉堆数据结构的排序算法,其原理如下:

  1. 构建最大堆:将待排序的数组看作一个完全二叉树,并通过调整节点的位置构建一个最大堆。最大堆满足每个父节点的值都大于或等于其子节点的值。构建最大堆的过程可以从最后一个非叶子节点开始,逐步向前,对每个节点进行下沉操作,使得子树满足最大堆的性质。

  2. 排序过程:构建完成最大堆后,将堆顶元素(即最大值)与数组的最后一个元素交换。然后,将堆的大小减1,再对堆顶元素执行下沉操作,以重新满足最大堆的性质。重复这个过程,直到堆的大小减少到1。最终,得到的数组就是有序的。

堆排序的关键操作是下沉(sink)和上浮(swim):

  • 下沉操作:将某个节点与其子节点中较大的节点交换位置,并递归地对交换后的子节点执行下沉操作,直到满足最大堆的性质。
  • 上浮操作:将某个节点与其父节点比较,如果节点的值大于父节点的值,则交换位置,并递归地对交换后的父节点执行上浮操作,直到满足最大堆的性质。

堆排序的时间复杂度为O(n log n),其中n是待排序数组的长度。构建最大堆的时间复杂度是O(n),排序过程需要进行n次下沉操作,每次下沉操作的时间复杂度是O(log n)。由于堆排序是原地排序算法,不需要额外的辅助空间,因此空间复杂度是O(1)。

需要注意的是,堆排序是不稳定的排序算法,即相等元素的相对顺序可能会发生改变。

#include <iostream>
using namespace std;void heapify(int arr[], int n, int i) {int largest = i;  // 将当前节点设置为最大值int left = 2 * i + 1;  // 左子节点索引int right = 2 * i + 2;  // 右子节点索引// 如果左子节点存在且大于根节点,则更新最大值索引if (left < n && arr[i] < arr[left]) {largest = left;}// 如果右子节点存在且大于根节点或左子节点,则更新最大值索引if (right < n && arr[largest] < arr[right]) {largest = right;}// 如果最大值不是根节点,则交换根节点和最大值,并继续调整堆if (largest != i) {swap(arr[i], arr[largest]);heapify(arr, n, largest);}
}void heapSort(int arr[], int n) {// 构建最大堆(从最后一个非叶子节点开始)for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// 逐个将最大值移到数组末尾,并重新调整堆for (int i = n - 1; i > 0; i--) {swap(arr[0], arr[i]);  // 交换根节点和最后一个节点heapify(arr, i, 0);}
}int main() {int arr[] = {12, 11, 13, 5, 6, 7};int n = sizeof(arr) / sizeof(arr[0]);heapSort(arr, n);cout << "排序后的数组: ";for (int i = 0; i < n; i++) {cout << arr[i] << " ";}return 0;
}

相关文章:

C++ 堆排序

C 堆排序 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;其原理如下&#xff1a; 构建最大堆&#xff1a;将待排序的数组看作一个完全二叉树&#xff0c;并通过调整节点的位置构建一个最大堆。最大堆满足每个父节点的值都大于或等于其子节点的值。构建最大堆的过程可以…...

U3D记录之FBX纹理丢失问题

今天费老大劲从blender建了个模型&#xff0c;然后导出进去unity 发现贴图丢失 上网查了一下 首先blender导出要改设置 这个path mode要copy 然后unity加载纹理也要改设置 这里这个模型的纹理load要改成external那个模式 然后就有了&#xff0c;另外这个导出还有好多选项可…...

监测Nginx访问日志502情况后并做相应动作

今天带大家写一个比较实用的脚本哈 原理&#xff1a; 假设服务器环境为lnmp&#xff0c;近期访问经常出现502现象&#xff0c;且502错误在重启php-fpm服务后消失&#xff0c;因此需要编写监控脚本&#xff0c;一旦出现502&#xff0c;则自动重启php-fpm服务 场景&#xff1a; 1…...

【数据分享】1929-2023年全球站点的逐年平均风速(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…...

Android性能调优 - 应用安全问题

Android应用安全 1.组件暴露&#xff1a; 像比如ContentProvider,BroadcastReceiver&#xff0c;Activity等组件有android:exported属性&#xff1b; 如果是私有组件 android:exported “false”&#xff1b; 如果是公有组件 android:exported “true” 且进行权限控制&…...

C#的Char 结构的像IsLetterOrDigit(Char)等常见的方法

目录 一、Char 结构的方法 二、Char.IsLetterOrDigit 方法 1.Char.IsLetterOrDigit(Char)用法 2.IsLetterOrDigit(String, Int32)方法 三、Char.IsLetter 方法 1.IsLetter(Char) 2.IsLetter(String, Int32) 四、Char.IsDigit 方法 1. IsDigit(String, Int32) 2.IsDig…...

部分意图分类【LLM+RAG】

在生成人工智能领域工作最有价值的事情之一就是发现新兴技术如何融入新的解决方案。 举个例子&#xff1a;在为北美顶级金融服务公司之一设计对话式人工智能助手时&#xff0c;WillowTree 的数据和人工智能研究团队 (DART) 发现&#xff0c;将意图分类与大型语言模型 (LLM) 结合…...

1277. 统计全为 1 的正方形子矩阵

1277. 统计全为 1 的正方形子矩阵 题目链接&#xff1a;1277. 统计全为 1 的正方形子矩阵 代码如下&#xff1a; class Solution { public:int countSquares(vector<vector<int>>& matrix) {if(matrix.size()0||matrix[0].size()0) return 0;//dp[i][j]代表…...

Python 3 时间序列可视化指南

简介 时间序列分析属于统计学的一个分支&#xff0c;涉及对有序的、通常是时间性的数据进行研究。当适当应用时&#xff0c;时间序列分析可以揭示意想不到的趋势&#xff0c;提取有用的统计数据&#xff0c;甚至预测未来的趋势。因此&#xff0c;它被应用于许多领域&#xff0…...

[算法前沿]--059-大语言模型Fine-tuning踩坑经验之谈

前言 由于 ChatGPT 和 GPT4 兴起,如何让人人都用上这种大模型,是目前 AI 领域最活跃的事情。当下开源的 LLM(Large language model)非常多,可谓是百模大战。面对诸多开源本地模型,根据自己的需求,选择适合自己的基座模型和参数量很重要。选择完后需要对训练数据进行预处…...

【Docker】01 Docker安装与配置

文章目录 一、Docker二、离线安装Docker三、联网安装Docker3.1 下载YUM软件库文件3.2 安装epel-release3.3 安装yum-utils3.4 设置镜像仓库3.5 查看docker-ce所有版本3.6 安装Docker3.7 启动Docker3.8 查看Docker信息3.9 启动第一个容器 四、一些配置4.1 登录DockerHub4.2 镜像…...

Unity3d Shader篇(六)— BlinnPhong高光反射着色器

文章目录 前言一、BlinnPhong高光反射着色器是什么&#xff1f;1. BlinnPhong高光反射着色器的工作原理2. BlinnPhong高光反射着色器的优缺点优点缺点 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三…...

Go-zero微服务个人探究之路(十二)定时任务的选择调研

前言 很多时候后台需要做定时任务的需求&#xff0c;笔者的项目采用go-zero框架微服务框架&#xff0c;需要做定时任务&#xff0c;于是做了如下方法调研&#xff0c;共有大概三种主要选择 方案 难度总体由容易到复杂 go的timer库 通过Go的标准库time中的Ticker和Tick功能…...

Java中,List、Map和Set的区别是什么?

在Java中&#xff0c;List、Map和Set是三种常用的集合类型&#xff0c;它们之间的主要区别如下&#xff1a; 1、List List是有序集合&#xff0c;它可以包含重复元素。 List中的元素是按照插入顺序排列的&#xff0c;可以通过索引访问每个元素。 Java中常见的List实现类有A…...

Google刚刚推出了图神经网络Tensorflow-GNN

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

链表基础知识汇总

链表 链表是一种基本的数据结构&#xff0c;是由一系列节点组成的集合。每个节点包含两个部分&#xff1a;值和指向下一个节点的指针。链表中的节点可以动态地添加、删除&#xff0c;其大小可以根据需要进行扩展或缩小。 链表通常用于处理不固定长度的数据结构&#xff0c;具有…...

Educational Codeforces Round 2(远古edu计划)

A. 恶心模拟。。 模拟一下分类即可 数字类&#xff0c;数字0&#xff0c;或者都是数字 字母类&#xff0c;字母空的也是字母&#xff0c;有字母就是字母 #include<bits/stdc.h> #define INF 1e9 using namespace std; typedef long long ll; const int N2e59; strin…...

【Tauri】(1):使用Tauri1.5版本,进行桌面应用开发,在windows,linux进行桌面GUI应用程序开发,可以打包成功,使用 vite 最方便

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Pz421d7s4/ 【Tauri】&#xff08;1&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows&#xff0c;linux进行桌面GUI应用程序开发&#xff0c;可以打包成功&…...

「Linux」软件安装

MySQL5.7在CentOS安装 安装 配置yum仓库 更新密钥&#xff1a;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022安装MySQL yum库&#xff1a;rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm使用yum安装MySQL&#xff1a;yum -y in…...

Ubuntu Desktop - Terminal 输出全部选中 + 复制

Ubuntu Desktop - Terminal 输出全部选中 复制 1. Terminal2. Terminal 最大化3. Edit -> Select All4. Copy & PasteReferences 1. Terminal 2. Terminal 最大化 3. Edit -> Select All 4. Copy & Paste Edit -> Copy or Shift Ctrl C Edit -> Paste…...

【软考高级架构】案例题考前突击——分布式一致性在互联网金融平台的应用

案例分析题:分布式一致性在互联网金融平台的应用 案例背景 某互联网金融平台为了满足高并发、高可用的业务需求,采用了基于微服务和分布式架构的系统设计。平台核心业务包括账户余额管理、交易流水记录、资金划转等关键模块。 为提升系统性能,架构师引入了如下关键设计:…...

【全网最全图文版】Windows 版 Open Claw v 2.7.5 纯净版搭建教程

&#x1f4cc; 前言 开源圈热门的「数字员工」OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub 星标突破 28 万&#xff0c;凭借本地运行 零代码操作 自动干活的核心优势广受关注&#xff01;很多人误以为它是普通聊天 AI&#xff0c;实则是能真正操控电脑的…...

定点乘法避坑指南:做数字信号处理时,你的精度是怎么丢的?(附MATLAB/Python验证脚本)

定点乘法避坑指南&#xff1a;数字信号处理中的精度保卫战 在数字信号处理的世界里&#xff0c;定点乘法就像一位沉默的守护者——当它正常工作时&#xff0c;你几乎感受不到它的存在&#xff1b;但当它出错时&#xff0c;整个系统可能瞬间崩溃。想象一下这样的场景&#xff1a…...

接口自动化测试框架搭建:基于Python+Requests+Pytest的实战教程

在软件测试领域&#xff0c;接口自动化测试是保障系统稳定性、提升测试效率的关键手段。随着敏捷开发和DevOps理念的普及&#xff0c;自动化测试的重要性愈发凸显。Python凭借其简洁的语法、丰富的库生态&#xff0c;成为接口自动化测试的首选语言&#xff1b;Requests库让HTTP…...

如何高效下载B站视频:BiliDownloader终极使用教程

如何高效下载B站视频&#xff1a;BiliDownloader终极使用教程 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简&#xff0c;操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 想要轻松保存B站上的精彩视频内容…...

解锁Windows风扇智能调控:从噪音困扰到静音享受的完整旅程

解锁Windows风扇智能调控&#xff1a;从噪音困扰到静音享受的完整旅程 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

终极指南:5分钟在ComfyUI中实现智能图像分割

终极指南&#xff1a;5分钟在ComfyUI中实现智能图像分割 【免费下载链接】comfyui_segment_anything Based on GroundingDino and SAM, use semantic strings to segment any element in an image. The comfyui version of sd-webui-segment-anything. 项目地址: https://git…...

JiYuTrainer高效实用指南:3步解锁极域电子教室控制,恢复电脑操作自由

JiYuTrainer高效实用指南&#xff1a;3步解锁极域电子教室控制&#xff0c;恢复电脑操作自由 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 还在为课堂上被老师全屏控制电脑而烦…...

如何用韭菜盒子打造你的VSCode投资信息中心:5大实用功能深度体验

如何用韭菜盒子打造你的VSCode投资信息中心&#xff1a;5大实用功能深度体验 【免费下载链接】leek-fund :chart_with_upwards_trend: 韭菜盒子VSCode插件&#xff0c;可以看股票、基金、期货等实时数据。 LeekFund turns your VS Code and Cursor into a real-time stock, fun…...

轻松解包网易游戏资源:unnpk工具完整使用指南

轻松解包网易游戏资源&#xff1a;unnpk工具完整使用指南 【免费下载链接】unnpk 解包网易游戏NeoX引擎NPK文件&#xff0c;如阴阳师、魔法禁书目录。 项目地址: https://gitcode.com/gh_mirrors/un/unnpk 想要探索网易游戏如《阴阳师》、《魔法禁书目录》中的精美角色立…...