大顶堆、小顶堆

    • 堆的维护
      • 1.自我初始化
      • 代码
      • 2.插入时维护
      • 时间复杂度

代码如有误欢迎指出

本文是最近在整理排序算法的时候写到堆排序单拎出来写的,目前只有维护代码

堆是一颗完全二叉树,同时保证所有双亲都比自己的孩子大(可以相等

堆的维护

使用数组存储,长度为 n+1,从 1 索引开始存储,对 i i i 2 i 2i 2i 2 i + 1 2i+1 2i+1 是孩子, i 2 \frac{i}{2} 2i是双亲

1.自我初始化

把一个现有数组自我初始化为堆:
 原理:
先把小的子树维护好,然后由小至大维护
从第二小的子树开始(最小的子树是叶子)
找到子树,维护就是看左右子树是否有应该当堆顶的(如小顶堆就是找是否有比双亲节点小的孩子)

 实现:
索引值最大的第二小的子树是几?是 n 2 \frac{n}{2} 2n
注意,调整子树的堆顶之后有可能影响子树的子树,需要往下继续维护,直到叶子

维护小顶堆示例:
在这里插入图片描述
在这里插入图片描述

代码

/*测试样例1
8 
53 17 72 5 39 67 94 25
得到:
5 17 67 25 39 72 94 53
*/
/*测试样例2
9 
53 17 72 5 39 94 67 25 1
得到:
1 5 67 17 39 94 72 25 53
*/
#include <iostream>
using namespace std;
int nums[105];
int n;

void adjustDown(int heap[],int i,int n)
{
 
    int child_p = 2 * i;    //i结点(在循环中是指对应调整的子树)的孩子的索引
    int parent = heap[i];   //本子树的根结点的值
    while (child_p<=n)      //保证双亲是有孩子结点的,叶子结点本身就是排好的堆,不需要调整
    {
        if (child_p + 1 <= n && heap[child_p + 1] < heap[child_p])   child_p++;//选中左右孩子中更小的和双亲作比较
        if (heap[child_p] < parent)
        {
            heap[child_p / 2] = heap[child_p];//将孩子的值赋给父亲
            child_p *= 2;
        }
        else
        {
            break;
        }
    }
    heap[child_p/2] = parent;//这一步容易忘记!!!!就是赋回i结点的值!当然如果每次比较完用tmp去做交换就可以不用这么麻烦,我就是不想用tmp交换,因为那样有三次赋值,而这样写只有一次
}

int main()
{
    //数组初始化
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> nums[i];
    }

    //小顶堆初始化
    for (int i = n/2; i >=1; i--)
    {
        adjustDown(nums, i, n);
    }
    //排序后展示
    for (int i = 1; i <= n; i++)
    {
        cout << nums[i] << ' ';
    }
    cout << endl;
}

2.插入时维护

思路和自我初始化差不多,就是从下而上,从插入结点的双亲比较,往上找需要调整的每一个结点

/*测试样例1
8
53 17 72 5 39 67 94 25
得到:
5 17 67 25 39 72 94 53
*/
/*测试样例2
9
53 17 72 5 39 94 67 25 1
得到:
1 5 67 17 39 94 72 53 25(注意,这个和自我初始化的结果不一定一样)
*/
#include <iostream>
using namespace std;
int nums[105];
int n;

void heapInsertAdjust(int heap[], int i)//尾部插入后做的调整
{
    int child = heap[i];    //最初插入的值,循环中做每次比较的孩子
    int parent_p = i / 2;   //循环中每次比较的双亲索引
    int lastParent_p = i;   //循环中最后一次赋给双亲的位置,默认不交换就是i原地(其实就是“上一个双亲”的位置,因为/2会默认向下取整,需要用这个标记
    while (parent_p >= 1)
    {
        if (heap[parent_p] > child)
        {
            heap[lastParent_p] = heap[parent_p];  //将双亲的值赋给孩子,继续往上找
            lastParent_p = parent_p;              //更新赋值位置
            parent_p /= 2;
        }
        else break;
    }
    heap[lastParent_p] = child;
}

int main()
{
    //数组初始化
    cin >> n;

    for (int i = 1; i <= n; i++)
    {
        int tmp;
        cin >> nums[i];
        heapInsertAdjust(nums, i);//插入的时候调整
    }


    //排序后展示
    for (int i = 1; i <= n; i++)
    {
        cout << nums[i] << ' ';
    }
    cout << endl;
}

时间复杂度

插入时维护:O(logn)
自我初始化:adjustDown部分为O(logn),有n/2趟,所以是O(nlogn)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【无标题】力扣报错:member access within null pointer of type ‘struct ListNode‘

项目场景&#xff1a; 做单链表反转题目&#xff0c;报错&#xff1a;member access within null pointer of type ‘struct ListNode’ 题目链接:LINK 问题描述 我明明在初始化指针时候&#xff0c;已经处理了n2->next情况却依然报错 这个报错提示含义是&#xff1a;大概就…

VNCTF2024misc方向部分wp

文章目录 sqlsharkLearnOpenGLez_msbOnlyLocalSql sqlshark tshark -r sqlshark.pcap -Y "http" -T fields -e frame.len -e http.file_data > data.txt不太像常规的盲注&#xff0c;一次性发送两条很类似的payload&#xff0c;比常规的多了一个least在判断passw…

C语言——从头开始——深入理解指针(1)

一.内存和地址 我们知道计算上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;是通过地址总线把需要的数据从内存中读取的&#xff0c;后通过数据总线把处理后的数据放回内存中。如下图所示&#xff1a; 计算机把内存划分为⼀个个的内存单元&#xff0c;每…

python-pyqt5-工具按钮(QToolButton)添加菜单(QMenu)

QToolButton提供了比普通按钮更丰富的功能。它可以显示一个图标、一个文本或二者结合&#xff0c;还支持各种样式和行为&#xff0c;例如弹出菜单或多种动作模式 样式 setToolButtonStyle(Qt.ToolButtonStyle) # 设置按钮样式风格# 参数Qt.ToolButtonIconOnly …

Window系统GPT-SoVITS配置安装

GPT-SoVITS配置安装 GPT-SoVITS配置Python下载以及安装源文件安装依赖 运行整理在安装配置环境时遇到的报错总结 GPT-SoVITS配置 作者链接 Python下载以及安装 版本这里根据教程的版本走即可&#xff0c;这里不会安装python或者不会配置环境的参考我之前的文章 Python 3.9,…

Requests教程-11-重定向与请求历史

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上小节中&#xff0c;我们学习了requests的Session会话对象&#xff0c;本小节我们讲解一下requests的重定向与请求历史。 重定向的定义&#xff1a; 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方…

STM32 TIM输入捕获测频率占空比库函数

目录 一、输入捕获初始化函数 TIM_ICInit TIM_PWMIConfig TIM_ICStructInit 二、主从触发模式对应函数 TIM_SelectInputTrigger TIM_SelectOutputTrigger TIM_SelectSlaveMode 三、配置分频器函数 TIM_SetIC1Prescaler TIM_SetIC2Prescaler TIM_SetIC3Prescaler T…

浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用

摘要&#xff1a;本文分析了木材加工企业的特点、现状及常见电气火灾隐患&#xff0c;提出了消灭电气火灾隐患的措施。结尾介绍了木材加工企业常用电气设备的选用及电气火灾监控系统在其低压配电系统的应用方案及产品选型。 关键词&#xff1a;木材加工企业&#xff1b;电气火…

kafka的安装,用于数据库同步数据

1.0 背景调研 因业务需求&#xff0c;需要查询其他部门的数据库数据&#xff0c;不方便直连数据库&#xff0c;所以要定时将他们的数据同步到我们的环境中&#xff0c;技术选型选中了kafkaCDC Kafka是Apache旗下的一款分布式流媒体平台&#xff0c;Kafka是一种高吞吐量、持久…

微服务—RabbitMQ高级(延迟消息)

本博客为个人学习笔记&#xff0c;学习网站&#xff1a;2023黑马程序员RabbitMQ入门到实战教程 高级篇章节 目录 延迟消息 死信交换机 延迟消息插件 下载安装 延迟交换机声明 ​编辑 发送延迟消息 订单状态同步问题 延迟消息 在电商的支付业务中&#xff0c;对于一些库…

基于springboot学生就业管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;学生就业管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而…

word中插入代码

可以先把代码在highlightcode 中格式化后复制插入 highlightcode地址&#xff1a;https://highlightcode.com/ 复制到word后效果&#xff0c;可以看到美观多了 原始效果

Java面试题:volatile专题

王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》第4篇文章,我们一起来看看面试中会问到哪些关于volatile的问题吧。数据来源: 大部分来自于各机构(Java之父,Java继父,某灵,某泡,某客)以及各博主整理文档…

基于uniapp微信小程序的汽车租赁预约系统

随着现代汽车租赁管理的快速发展&#xff0c;可以说汽车租赁管理已经逐渐成为现代汽车租赁管理过程中最为重要的部分之一。但是一直以来我国传统的汽车租赁管理并没有建立一套完善的行之有效的汽车租赁管理系统&#xff0c;传统的汽车租赁管理已经无法适应高速发展&#xff0c;…

leetcode面试题 02.07. 链表相交

leetcode面试题 02.07. 链表相交 题目 思路 方案一&#xff1a;使用哈希表储存一个链表节点&#xff0c;在另一个链表进行查询是否有相同节点方案二&#xff1a;统计两个链表长度&#xff0c;然后末尾对齐&#xff0c;判断是否有相同节点 代码 使用哈希表set # Definition…

新手搭建服装小程序全攻略

随着互联网的快速发展&#xff0c;线上购物已经成为了人们日常生活中不可或缺的一部分。服装作为人们日常消费的重要品类&#xff0c;线上化趋势也日益明显。本文将详细介绍如何从零开始搭建一个服装小程序商城&#xff0c;从入门到精通的捷径&#xff0c;帮助你快速掌握小程序…

compile 未产生 target 目录

Problem 执行compile操作之后未产生对应的target目录 右击Project → Tree Appearance → Show Excluded Files

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用&#xff1a;避免写一大堆的import&#xff0c;比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

C# Winfrom实现的肺炎全国疫情实时信息图

运行结果&#xff1a; using System; using System.Drawing; using System.Text; using NSoup; using NSoup.Nodes; using System.IO; using System.Net; using System.Text.RegularExpressions; using System.Windows.Forms;namespace Pneumonia {public partial class MainFo…

Arcmap excel转shp

使用excel表格转shp的时候&#xff0c;如果你的excel里面有很多字段&#xff0c;直接转很大概率会出现转换结果错误的情况&#xff0c;那么就需要精简一下字段的个数。将原来的表格文件另存一份&#xff0c;在另存为的文件中只保留关键的经度、纬度、和用于匹配的字段即可&…