堆排序--C++实现

news2024/11/25 2:56:08

1. 简介

堆排序利用的是堆序性,最小堆进行从大到小的排序。
先建初堆,保证堆序性。将堆顶元素与最后一个元素交换,
就将当前堆中的最大(小)的元素放到了最后后。堆大小递减,再重新调整堆选出第二大,重复上述过程。

2. 实现

2.1 建初堆

由于堆具有递归性,即以根节点的所有子树都是一个堆。

我们需要从下往上调整堆。即从完全二叉树的最大非叶子节点开始调整堆,直到根节点。

这样才能保证堆序性。

对于数组3,4,1,2,5 ,建初堆的过程。

在这里插入图片描述

  • 代码
template<typename T>
void adj_heap(std::vector<T> &arr,std::size_t rt, std::size_t bd) {

    T v = arr[rt];
    std::size_t child;
    std::size_t i;

    for (i = rt; i < bd; i = child) {

        child = i * 2 + 1;
        if ( child + 1 < bd && arr[child + 1] < arr[child])
            ++child;

        if (child >= bd || v <= arr[child] ) {
            break;
        }
        else{
            arr[i] = arr[child];
        }

    }

    arr[i] = v;
}


template<typename T>
void make_orig_heap(std::vector<T> &arr, std::size_t sz) {

    for (std::size_t i = sz/2 - 1; i != -1; --i){
        adj_heap(arr, i, sz);
    }
}
2.2 堆排序

建立初始堆后,我们就确定了最小(大)的元素。

将该元素与最后位置交换,并将堆大小 - 1。

我们就又得到了一个未调整的堆。我们重复调整堆和交换元素的过程,直到最后堆大小为1。

所以,最小堆进行排序形成的序列是从大到小。
过程如图
在这里插入图片描述

  • 代码
template<typename T>
void heap_sort(std::vector<T> &arr, std::size_t sz) {

    if ( 0 == sz)
        return ;

    make_orig_heap(arr, sz);
    
    

    for (std::size_t i = sz - 1; i > 0; --i) {
        T last = arr[i];
        arr[i] = arr[0];
        arr[0] = last;
        adj_heap(arr, 0, i);
    }

}

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

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

相关文章

python推导式特殊用法

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 字典推导式 >>> dic {x: x**2 for x in (2, 4, 6)} >>> dic {2: 4, 4: 16, 6: 36} >>> type(dic) <class dict>集合推导式 …

VSCode 的 C/C++ 开发环境的傻瓜级自动部署程序

软件介绍 VSCode 是一款优秀的编辑器&#xff0c;可以通过各种插件&#xff0c;将其配置成 C/C 开发环境。只是对于初学者而言&#xff0c;配置步骤有点繁琐。 软件 VSCode-Setup(MinGW) 提供了自动下载安装 VSCode 并配置成 C/C 开发环境的功能。无需担心该软件会对系统有额…

JavaWeb | JavaWeb开发环境相关知识点

JavaWeb开发环境相关知识点: 1.C/S结构、B/S结构2.浏览器与服务器的交互模式3.Tomcat安装目录中&#xff0c;比较重要的文件夹/文件4.怎么修改Tomcat端口&#xff1f;5.URL /url / 统一资源定位符 1.C/S结构、B/S结构 网络应用程序中&#xff0c;有 两种基本结构&#xff1a; C…

java.io.FileNotFoundException: D:\桌面\file3 (拒绝访问。)

java.io.FileNotFoundException: D:\桌面\file3 拒绝访问。 问题描述一、问题原因及其解决办法 问题描述 今天笔者使用FileInputStream输入流的时候&#xff0c;向里面添加了&#xff08;new File(“D://桌面//file3”)的File文件参数&#xff09;&#xff0c;最后不管怎样运行…

广州华锐互动:数字孪生可视化制作软件有哪些亮点?

由广州华锐互动开发的数字孪生可视化制作软件在当今的数字孪生领域中扮演着重要角色&#xff0c;它突破了许多传统数字孪生可视化制作软件的限制。以下是几个方面的突破&#xff1a; 无限自由度&#xff1a;传统的3D建模工具通常有限制编辑器的自由度&#xff0c;使用户难以进行…

KEDA:基于事件驱动扩展K8S应用的深度实践

新钛云服已累计为您分享773篇技术干货 为什么我们要自动扩展应用程序&#xff1f; 作为 SRE&#xff0c;需要保证应用弹性和高可用性。因此&#xff0c;自动缩放是我们需要的必须功能。通过自动缩放&#xff0c;我们能确保工作负载能够高效的地处理业务流量。 在本文中&#xf…

[vmware]vmware虚拟机压缩空间清理空间

vmware中的ubuntu使用如果拷贝文件进去在删除&#xff0c;vmare镜像文件并不会减少日积月累会不断是的真实物理磁盘空间大幅度减少&#xff0c;比如我以前windows操作系统本来只有30GB最后居然占道硬盘200GB&#xff0c;清理方法有2种。 第一种&#xff1a;vmware界面操作 第二…

Dubbo篇---第二篇

系列文章目录 文章目录 系列文章目录一、注册中心挂了,consumer 还能不能调用 provider?二、怎么实现动态感知服务下线的呢?三、Dubbo 负载均衡策略?一、注册中心挂了,consumer 还能不能调用 provider? 可以。因为刚开始初始化的时候,consumer 会将需要的所有提供者的地…

多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

解决Ts中的error.stack报错property ‘stack‘ does not exist on type ‘unknown typescript

我用的Ts版本是5.x&#xff0c;所以在使用的时候出现了这个问题 解决方式&#xff1a; 将error先转一遍就好了 参考链接&#xff1a; 你真的会处理TS中的Error么 - 掘金 (juejin.cn) Announcing TypeScript 4.4 - TypeScript (microsoft.com)

黑群晖安装及使用小计

最近发现4t的盘装满了&#xff0c;最主要的照片也来到了4万张大关。所以怎么处理&#xff0c;怎么定位&#xff0c;怎么更方便的查找图片就变得很重要。 第一步我选择了picturama这个软件&#xff0c;只要指定图片文件夹&#xff0c;能够很快速 的浏览&#xff0c;并且带时间轴…

Zabbix结合Grafana统计日志网站访问量

Zabbix除了可以通过HTTP代理及WEB场景监控网站的响应结果、响应时间和传输速度等&#xff0c;也可以通过读取网站的后台日志&#xff0c;获取有用的统计信息。 下面我以Grafana为例&#xff0c;通过日志统计网站的访问量。 操作如下&#xff1a; 1、读取grafana日志 首先要基…

基于单片机的商场防盗防火系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统分析二、系统总设计2.1基于单片机的商场防火防盗系统的总体功能2.2系统的组成 三 软件设计4.1软件设计思路4.2软件的实现4.2.1主控模块实物 四、 结论五、 文章目录 概要 本课题设计一种商场防火防盗报警…

Webpack的入口(entry)和出口(output)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

C++笔记之std::pair

C笔记之std::pair code review!

java EE 进阶

java EE 主要是学框架(框架的使用,框架的原理) 框架可以说是实现了部分功能的半成品,还没装修的毛坯房,然后我们再自己打造成自己喜欢的成品 这里学习四个框架 : Spring ,Spring Boot, Spring MVC, Mybatis JavaEE 一定要多练习,才能学好 Maven 目前我们主要用的两个功能: …

堆叠注入 [GYCTF2020]Blacklist1

打开题目 判断注入点 输入1&#xff0c;页面回显 输入1 页面报错 输入 1 # 页面正常&#xff0c;说明是单引号的字符型注入 我们输入1; show databases; # 说明有6个数据库 1; show tables; # 说明有三个表 我们直接查看FlagHere的表结构 1;desc FlagHere&#xff1b;# 发…

selenium自动化测试入门 —— 定位frame和iframe中的元素对象

< frame> <iframe> 标签&#xff0c;浏览器会在标签中打开一个特定的页面窗口&#xff08;框架&#xff09;&#xff0c;它在本窗口中嵌套进入一个网页&#xff0c;当用selenium定位页面元素的时候会遇到定位不到frame框架内的元素的问题。 定位frame中的元素前我…

代码随想录算法训练营第四十三天 | LeetCode 518. 零钱兑换 II、377. 组合总和 Ⅳ

代码随想录算法训练营第四十三天 | LeetCode 518. 零钱兑换 II、377. 组合总和 Ⅳ 文章链接&#xff1a;完全背包理论基础 零钱兑换 II 组合总和 Ⅳ 视频链接&#xff1a;完全背包理论基础 零钱兑换 II 组合总和 Ⅳ 1. 完全背包理论基础 1.1 思路 完全背包和 01 背包的区别就是…

Find My手机保护壳|苹果Find My与手机保护壳结合,智能防丢,全球定位

随着科技水平的快速发展&#xff0c;科技美容这一行业做为新型产业新生而出。时尚IT品牌随着市场的多元化发展。针对手机品牌和功能的增加而呈多样化&#xff0c;将手机保护壳按质地分有PC壳&#xff0c;皮革 &#xff0c;硅胶&#xff0c;布料&#xff0c;硬塑&#xff0c;皮套…