c++堆排序原理和实现

2023-05-16

堆排序,C++实现 

    堆是一种特殊的树形数据结构,即完全二叉树。堆分为大根堆和小根堆,大根堆为根节点的值大于两个子节点的值;小根堆为根节点的值小于两个子节点的值,同时根节点的两个子树也分别是一个堆。

 基本思路

  • 步骤一:建立大根堆--将n个元素组成的无序序列构建一个大根堆,
  • 步骤二:交换堆元素--交换堆尾元素和堆首元素,使堆尾元素为最大元素;
  • 步骤三:重建大根堆--将前n-1个元素组成的无序序列调整为大根堆

    重复执行步骤二和步骤三,直到整个序列有序。

  • 步骤一:建立大根堆

① 无序序列建立完全二叉树

image

② 从最后一个叶子节点开始,从左到右,从下到上调整,将完全二叉树调整为大根堆

a.找到第1个非叶子节点6,由于6的右子节点9比6大,所以交换6和9。交换后,符合大根堆的结构。

image

c.找到第2个非叶子节点4,由于的4左子节点9比4大,所以交换4和9。交换后不符合大根堆的结构,继续从右到左,从下到上调整。

image

image

 

  • 步骤二:交换堆元素(交换堆首和堆尾元素--获得最大元素)

image

  • 步骤三:重建大根堆(前n-1个元素)

image

  • 重复执行步骤二和步骤三,直到整个序列有序

image

# C++代码

#include<iostream>
#include<vector>
using namespace std;
 
// 递归方式构建大根堆(len是arr的长度,index是第一个非叶子节点的下标)
void adjust(vector<int> &arr, int len, int index)
{
    int left = 2*index + 1; // index的左子节点
    int right = 2*index + 2;// index的右子节点
 
    int maxIdx = index;
    if(left<len && arr[left] > arr[maxIdx])     maxIdx = left;
    if(right<len && arr[right] > arr[maxIdx])     maxIdx = right;
 
    if(maxIdx != index)
    {
        swap(arr[maxIdx], arr[index]);
        adjust(arr, len, maxIdx);
    }
 
}
 
// 堆排序
void heapSort(vector<int> &arr, int size)
{
    // 构建大根堆(从最后一个非叶子节点向上)
    for(int i=size/2 - 1; i >= 0; i--)
    {
        adjust(arr, size, i);
    }
 
    // 调整大根堆
    for(int i = size - 1; i >= 1; i--)
    {
        swap(arr[0], arr[i]);           // 将当前最大的放置到数组末尾
        adjust(arr, i, 0);              // 将未完成排序的部分继续进行堆排序
    }
}
 
int main()
{
    vector<int> arr = {8, 1, 14, 3, 21, 5, 7, 10};
    heapSort(arr, arr.size());
    for(int i=0;i<arr.size();i++)
    {
        cout<<arr[i]<<endl;
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++堆排序原理和实现 的相关文章

  • 高翔博士:视觉SLAM十四讲笔记(nX)

    0 为什么标题的编号是 xff08 nX xff09 因为是在学习到第7章的时候 xff0c 被有关G2O的安装和编译不通过给搞疯了 xff0c 要成魔了 xff0c 才想起了应该把踩过的坑记录下来 xff0c 以供日后学习 xff0c 也
  • GetAsyncKeyState函数中按键的信息

    转自MSDN http msdn microsoft com en us library windows desktop dd375731 v 61 vs 85 aspx 用法 if GetAsyncKeyState 0x51 amp 0x
  • 在Jetson Nano上编译FastDeploy

    1 C 43 43 库的编译 span class token function git span clone https github com PaddlePaddle FastDeploy git span class token bu
  • 一文掌握FastDeploy Serving服务化部署(打造线上证件照制作系统,含完整代码)

    目录 一 概述1 1 服务化部署1 2 FastDeploy简介 二 搭建线上证件照制作系统2 1 准备环境2 1 1 安装Docker2 1 2 安装NVIDIA Container Toolkit2 1 3 获取FastDeploy S
  • 部署散记1(增强)

    拉取modelscope镜像 span class token function sudo span span class token function docker span pull registry cn hangzhou aliyu
  • 图形化深度学习开发平台PaddleStudio(代码开源)

    目录 一 PaddleStudio概述二 环境准备2 1 安装PaddlePaddle2 2 安装依赖库 三 基本使用介绍3 1 启动3 2 快速体验3 2 1 下载示例项目3 2 2 训练3 2 3 评估3 2 4 测试3 2 5 静态图
  • 一款免费的人像修图工具(笨擦擦)

    推荐一个我们自己开发的免费人像修图工具 xff1a 笨擦擦 使用这个工具可以免费抠图 美颜 证件照制作 我们是一群因为兴趣聚在一起的 二哈 程序员 xff0c 我们没资金 没大佬 没资质 xff0c 但就是喜欢做一些有意思的事 笨擦擦 是我
  • 利用Python生成和识读二维码(QR Code)和微二维码(Micro QR Code)

    目录 一 环境准备二 二维码 xff08 QR Code xff09 生成和读取2 1 生成二维码2 2 读取二维码 三 微二维码 xff08 Micro QR Code xff09 生成和读取3 1 生成微二维码3 2 读取微二维码 之前
  • 贴图问题,opengl,linux,windows,消除锯齿,摩尔纹,yuv 还是 rgb

    1 消除锯齿和摩尔纹 windows下使用d3d是很方便的 xff0c 基本不用设置很多东西 xff0c 就可以做到 xff0c 所以windows上最好使用d3d 但是linux上有所不同 摩尔条纹是两条线或两个物体之间以恒定的角度和频率
  • QT基础(五)----QPainter高级功能

    一 场景和窗口 头文件MyWidget h ifndef MYWIDGET H define MYWIDGET H include lt QWidget gt include lt QGraphicsScene gt 场景 include
  • DSP28335 高速modbus代码实现

    程序特点 不使用while循环速度尽可能快速除去程序运行时间 xff0c 没有多余等待时间优化CRC校验方式 头文件modbus h span class token macro property span class token dire
  • matlab 画图时遇到的一些问题以及解决方法

    matlab 画图时遇到的一些问题以及解决方法 最近在使用 matlab 画图时 xff0c 遇到了许许多多各式各样的问题 xff0c 有些问题甚至折腾了很久才搞好 xff0c 特此记录下来 设置画图时图中线段的粗细plot x1 y1 3
  • Ubuntu18.04上Gazebo安装和使用

    一 基本介绍 Gazebo是一款与机器人开发相关的3D动态模拟仿真软件 xff0c 能够在复杂的室内和室外环境中准确有效地模拟机器人群 这款软件中包含了丰富的机器人模型 xff0c 环境库以及各种各样的传感器 xff0c 并且在操作方面它的
  • Python运行 import cv2 等报错 Illegal instruction (core dumped) 解决办法

    import cv2 报错 Illegal instruction core dumped nanopc T4 开发板上安装好 opencv 后 xff0c import cv2 时 会报错 Illegal instruction core
  • 多个py文件同时执行(多进程与多线程实现)

    本人在编写python程序时 xff0c 需要多个py文件在不同终端内同时运行 xff0c 从而配合实现某种功能 xff0c 经过多方查找与实验 xff0c 排除了很多无法使用的方案 xff0c 最终确定了以下两个方案 xff0c 现将其记
  • nanopc-T4 开发板通过USB麦克风采集录制音频

    文章目录 1 使用 nanopc T4 开发板采集音频2 使用 Tyless外置usb麦克风录制声音3 使用 ffrmpeg 将实时视频与音频合并并推流到 rtmp 服务器中4 成功实现opencv采集图像与音频合并推送到rtmp 1 使用
  • 北京超级云计算中心操作训练指南

    北京超级云计算中心操作指南 本人在实验室做深度学习图像领域相关研究 xff0c 前期使用实验室的设备 2080Ti xff0c 运行时间较慢 xff1b 跑一轮需要6个小时以上 xff1b 后来开始使用超算 xff0c 运行速度比实验室快多
  • windows to go 和 linux to go 制作教程

    文章目录 使用 ventoy 制作windows to go 和 linux to go 教程 xff0c 将系统装进U盘中随身携带1 ventoy 介绍2 准备工作3 windows to go3 1 将 U盘初始化3 2 虚拟磁盘安装
  • 使用nps搭建内网穿透并配置泛域名解析

    使用nps搭建内网穿透并配置泛域名解析 前言1 准备工作2 服务器端搭建nps并配置2 1 配置nps配置文件2 2 docker安装nps2 3 web端配置nps并使用 3 客户端使用nps4 配置泛域名解析5 参考链接 前言 nps是
  • web内外网判断界面

    因日常需要 xff0c 我们在实验室内网中部署了一个服务 xff0c 在校园网内都能正常访问 xff0c 同时配置了内网穿透服务 xff0c 实现外网也能正常访问 但外网访问毕竟是通过内网穿透实现 xff0c 稳定性与网速都有限制 xff0

随机推荐

  • 为无登陆鉴权功能的接口与网站添加登陆鉴权功能

    1 缘由 本人部分服务的测试接口为方便日常测试调试 xff0c 使用了 ip 43 端口 的形式进行访问 xff0c 并且未配置账号密码鉴权机制 在日常测试一段时间后 xff0c 终于还是收到了来自腾讯云的监管通知 xff0c 说服务存在数
  • RoboMaster机器人运行教程(一)

    1 环境配置 系统 xff1a ubuntu16 04 xff0c 安装ROS 2 基础学习 需要C 43 43 和python基础 xff0c 和ROS的基础知识 xff0c 网上有很多教程 xff0c 推荐知乎大佬教程 xff1a 我的
  • slambook2+ch7+pose_estimation_2d2d+估计多张图像之间的位姿

    算法 计算第一张图和第二张图的关键点并匹配以第一张图的相机坐标为世界坐标 xff0c 计算第二张图相对第一张图的旋转矩阵 平移矩阵不断更新第一张图 xff0c 在进行第二次计算时 xff0c 以第二张图为第一张图 xff0c 以第二张图的相
  • 重做Unbuntu 18.0.43 LTS系统 并为SLAM配置环境

    目录 前言 一 安装列表 1 Ubuntu 18 0 43 LTS 1 0 A 搜狗输入法 1 0 B ibus输入法安装 1 1 更换软件源 1 2 安装vim curl等工具 1 3 安装浏览器Chrome git等 1 4 安装g 4
  • PostMan各个版本下载

    打开地址 xff1a https gitee com hlmd PostmanCn
  • 快速解决matlab出现错误使用mex,未找到支持的编译器或 SDK的提示

    matlab mex命令提示找不到编译器或SDK 参考博客 xff1a https blog csdn net cfqcfqcfqcfqcfq article details 63295746 utm source 61 blogxgwz1
  • linux 串口应用层API

    include lt termios h gt struct termios oldtio newtio fd 61 open dev tty0 O RDWR O NOCTTY tcgetattr fd amp oldtio 获取终端参数
  • 2022年中国研究生数学建模竞赛B题-方形件组批优化问题

    一 背景介绍 智能制造被 中国制造2025 列为主攻方向 而个性化定制 更短的产品及系统生命周期 互联互通的服务模式等成为目前企业在智能制造转型中的主要竞争点 以离散行业中的产品为例 xff0c 如电子器件 汽车 航空航天零部件等 xff0
  • 无线网络知识、WiFi原理

    无线网络 B站链接 一 电磁波的传输 电磁波传播方式 地波 xff08 低于2MHZ xff09 天波 2MHZ 30MHZ 直线波 30MHZ以上 电磁波的发射与接收装置 天线 作用 xff1a 将电磁波辐射到空间中或收集电磁波 辐射模式
  • yolov5输出检测到的目标坐标信息

    找到detect py文件 span class token keyword for span span class token operator span xyxy span class token punctuation span co
  • TCP之 select模型

    前记 xff1a select模型主要用于解决tcp通信中 xff0c 每次处理一个独立的客户都要单独的开线程 xff0c 这样会导致客户连接数很大时 xff0c 线程数也会很多 而使用select就会将线程缩减至2个 xff0c 一个主线
  • ROS入门:GPS坐标转换&Rviz显示轨迹

    GPS信息是无法直接绘制轨迹的 xff0c 因为其x xff0c y为经纬度 xff0c z为高度 xff0c 单位不一样 xff0c 本程序实现了以下功能 xff1a 1 将GPS轨迹 xff0c 从经纬度WGS 84坐标转换到真实世界x
  • ubuntu实用技巧

    ubuntu 截图 xff03 保存到图片文件夹 Print Screen 截取整个桌面 Alt 43 Print Screen 截取选中的窗口 Shift 43 Print Screen 自由选区 xff03 复制到剪贴板 Ctrl 43
  • 在ThinkPad X280加装M.2硬盘上安装 Ubuntu 18.04.3 填坑记录

    填坑背景 用了一段时间的X280后 xff0c 突然想在M 2接口上加装一个 NVMe 2242 的SSD xff0c 发现 Lenovo 的BIOS设置的非常奇特 能够检测到这个硬盘 xff0c 但是启动项里就是不能识别 xff01 或许
  • sip注册示例

    这里给出一个sip注册的示例 xff0c 其中平台注册的密码为12345678 xff0c 供相关开发参考 REGISTER sip 34020000002000000001 64 192 168 88 119 SIP 2 0 Via SI
  • spring security验证流程

    工作需要 xff0c 又弄起了权限的管理 虽然很早以前都了解过基于容器的权限实现方式 xff0c 但是一直都觉得那东西太简陋了 后来使用liferay时发现它的权限系统的确做得很优秀 xff0c 感觉这也可能是它做得最出色的地方吧 但是当时
  • On make and cmake

    你或许听过好几种 Make 工具 xff0c 例如 GNU Make xff0c QT 的 qmake xff0c 微软的MS nmake xff0c BSD Make xff08 pmake xff09 xff0c Makepp xff0
  • 制作html css 步骤进度条(完整代码)

    这个动画步骤进度条的css制作的非常简单 那里有两个按钮可以控制步骤 xff0c 它们将逐步进行 我在这个多步骤进度条 css 中使用了 4 个步骤 如果你愿意 xff0c 你可以使用更多 我使用了一些 javascript 来创建这一步进
  • 搜狗语料库word2vec获取词向量

    一 中文语料库 本文采用的是搜狗实验室的搜狗新闻语料库 xff0c 数据链接 http www sogou com labs resource cs php 首先对搜狗语料库的样例文件进行分析 搜狗语料库由搜狗实验室提供 xff0c 我们使
  • c++堆排序原理和实现

    堆排序 xff0c C 43 43 实现 堆是一种特殊的树形数据结构 xff0c 即完全二叉树 堆分为大根堆和小根堆 xff0c 大根堆为根节点的值大于两个子节点的值 xff1b 小根堆为根节点的值小于两个子节点的值 xff0c 同时根节点