堆(堆排序和模拟堆)

news2024/12/24 21:02:46

如何手写一个堆

下标从1开始,如果从0开始的话,他的左儿子的下标就等于0*2 = 0,麻烦

手写堆可以实现的操作:1,插入一个数  2,求集合当中的最小值  3,删除最小值

4,删除任意一个元素  5,修改任意一个元素(stl中的堆不能直接实现功能四五,可以间接实现)

 堆是一颗完全二叉树

 以小根堆为例,根结点小于等于他的子节点,所以小根堆的根节点是最小的值

堆用一个一维数组存储,图中的x指下标

 刚开始输入所有值之后维护这棵树,让他成为堆的方法

 从倒数第二层开始往下down,倒数第二层的down执行一次,倒数第三层执行两次.....

总共的时间复杂度算下来是O(n)

堆的基本操作:

down(),up(),上面的五种操作全部可以用这两个拼接出来

down就是在父亲结点比儿子节点大了,然后在两个儿子结点中找一个最小的,然后和他交换,直到不再需要交换为止

up操作中小的子节点只需要和父节点进行比较然后交换 

 

堆排序

 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<unordered_map>

using namespace std;

const int N = 100010;

int m, n;
int h[N], siz;

void down(int u)
{
	int t = u;
	if (u * 2 <= siz && h[u * 2] < h[u]) t = u * 2;
	if (u * 2 + 1 <= siz && h[t] > h[u * 2 + 1]) t = u * 2 + 1;
	if (t != u)
	{
		swap(h[t], h[u]);
		down(t);
	}
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> h[i];
	siz = n;
	for (int i = n / 2; i >= 1; i--) down(i);
	while (m--)
	{
		cout << h[1] << ' ';
		h[1] = h[siz];
		siz--;
		down(1);
	}
	return 0;
}

 这里要把与siz的比较放在前面,否则会出现segmentation fault的错误

 

模拟堆

 

 hp数组是用数的下标得到插入顺序

ph数组是根据插入顺序得到数的下标

在交换两个数的时候需要先交换idx指向堆的关系,接着交换堆指向idx的关系,最后在将值进行交换

 

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 100010;

int n;
int h[N],hp[N],ph[N],cnt;

//如果要删除的是第k个数,那么直接交换就可以了,但是插入的是第k个插入的数,所以就需要idx来记录插入的顺序
//因为有idx来记录,所以idx和点之间就会存在联系,但是无法通过值来查找对应的idx,所以在原来ph【】数组的基础上,需要引进hp【】数组
//从而通过hp【i】 =  idx (i表示在数组中的第i位,idx表示在第idx次插入的数),有了hp【】数组的表示,
//那么我们就可以通过ph【】来找到第idx位插入的数字在第数组的第i位。
//所以在执行交换操作是的时候,我们要先交换idx指向堆的关系,接着交换堆指向idx的关系,最后在将值进行交换
void heap_swap(int a,int b)
{
    swap(ph[hp[a]],ph[hp[b]]);
    swap(hp[a],hp[b]);
    swap(h[a],h[b]);
}

void down(int u)
{
    int t = u;
    if(2 * u <=cnt && h[2 * u ] < h[t] ) t = 2 * u;
    if(2 * u + 1 <= cnt && h[2 * u + 1 ] < h[t]) t = 2 * u + 1;
    if(u != t)
    {
        heap_swap(u,t);
        down(t);
    }
}

void up(int u)
{
    while(u / 2 && h[u] < h[u / 2])
    {
        heap_swap(u,u / 2);
        u >>= 1;
    }
}

int main()
{
    cin>>n;
    int idx = 0;
    
    while(n -- )
    {
        char op[5];
        int k , x;
        cin>>op;
        if(!strcmp(op,"I"))
        {
            cin>>x;
            cnt ++;
            idx ++;
            ph[idx] = cnt;
            hp[cnt] = idx;
            h[cnt] = x;
            up(cnt);
        }
        else if(!strcmp(op,"PM")) cout<<h[1]<<endl;
        else if(!strcmp(op,"DM"))
        {
            heap_swap(1,cnt);
            cnt --;
            down(1);
        }
        else if(!strcmp(op,"D"))
        {
            cin>>k;
            k = ph[k];
            heap_swap(k,cnt);
            cnt --;
            up(k),down(k);
        }
        else
        {
            cin>>k>>x;
            k = ph[k];
            h[k] = x;
            up(k),down(k);
        }
    }
    return 0;
}

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

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

相关文章

基于樽海鞘群算法的线性规划求解matlab程序

基于樽海鞘群算法的线性规划求解matlab程序 1 樽海鞘群优化算法 1.1 生物启示 通过研究海底生物樽海鞘在觅食过程中群体呈链状向食物方向移动的行为活动&#xff0c;学者Mirjalili在2017年提出的一种新型启发式仿生算法—樽海鞘群智能优化算法&#xff08;Salp Swarm Algori…

javascript三种事件模型 + Dom事件流 +事件委托

目录三种事件模型● DOM0 级模型&#xff1a;● IE 事件模型&#xff1a;● DOM2 级事件模型&#xff1a;DOM事件流事件委托target/currentTarget/relateTarget的区别三种事件模型 ● DOM0 级模型&#xff1a; 这种模型不会传播&#xff0c;所以没有事件流的概念&#xff0c;…

Golang远程调试Debug环境

目录背景软件版本环境搭建安装Golang环境安装dlv环境启动远程环境Goland 连接远程环境参考背景 最近在做 Operator 的二次开发&#xff0c;开发语言是Golang。Operator 开发时候需要用到k8s集群&#xff0c;遗憾的是k8s编排的容器网络与本地网络不通&#xff0c;无法直接进行d…

十部必看特种部队电影之《勇者行动》

这部特种部队题材电影是馆长收藏了很久的网盘资源&#xff0c;今天拿出来分享给大家。

远程直接连接 MySQL 数据库,阿里云腾讯云允许远程连接教程

不使用SSH登录远程主机直接连接远程数据库 文章目录修改MySQL登录权限1、登录MySQL2、修改mysql库的user表3、防火墙开放3306端口Navicat直接连接远程数据库报错【报错】Cant connect to MySQL server (10060)1、网络问题2、mysql账户设置3、防火墙端口未开放4、查看云服务器商…

JWT -- Json Web token

JWT 的背景知识可以看这篇文章: JSON Web Token 入门教程 JWT 由三个部分组成&#xff1a; Header&#xff08;头部&#xff09;Payload&#xff08;负载&#xff09;Signature&#xff08;签名&#xff09; 在分布式系统下&#xff0c;存在跨session的问题&#xff0c;则使用…

[附源码]Python计算机毕业设计Django毕业生就业管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

cdn加速华为云obs桶文件配置过程(详细)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 前面写了一篇文章&#xff0c;jeecg-boot中上传图片到华为云obs云存储中 主要介绍了下&#xff0c;如何使用jeect-boot微服务将文件上传至obs中。 但是上传是没有问题&#xff0c;…

目前看过最全的一线大厂面试题(题 + 详解),你所不知道的都在这

前言 在过 1 个月即将进入 2023&#xff0c;然而面对今年的大环境而言&#xff0c;跳槽成功的难度比往年高了很多&#xff0c;很明显的感受就是&#xff1a;对于今年的 java 开发朋友跳槽面试&#xff0c;无论一面还是二面&#xff0c;都开始考验一个 Java 程序员的技术功底和…

FL Studio2022水果编曲音乐制作软件自带完整插件

FL Studio 2022是一款非常好用的音乐制作软件&#xff0c;又称水果编曲软件&#xff0c;软件集合了录音、混音、编辑等多种功能于一体&#xff0c;能够完成各种各样的音乐编曲工作&#xff0c;强大的音乐制作功能受到了很多用户的喜爱&#xff0c;帮你完成各种类型音乐的编曲制…

《500强高管谈VE》-企业经营与VE活动

文章出处&#xff1a;日本VE协会杂志文章翻译&#xff1a;泰泽项目部 关注泰泽&#xff1a;实现高利润企业 《500强高管谈VE》-企业经营与VE活动 作者&#xff1a;兄弟工业常务董事渡边共祥 由墨西哥货币不稳定引发的此次日元升值&#xff0c;一度跌破80日元&#xff0c;呈现…

Servlet程序及部署方式(Tomcat+Smart Tomcat)

目录 1、Servlet是什么&#xff1f; 2、Servlet程序【例——hello world】 2.1、创建项目 2.2、引入Servlet依赖 2.3、创建目录结构 2.4、编写代码 2.5、打包程序 2.6、部署程序 2.7、验证程序 3、更方便的部署方式——Smart Tomcat 1、Servlet是什么&#xff1f; Se…

初识计算机网络

目录 网络的发展 重新看待计算机结构 大型存储平台 认识 "协议" 网络和OS之间的关系 初识网络协议 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 局域网通信的原理 如果进行跨网络传输 网络通信里面的基本轮廓 数据包封装和分用…

多线程同步

文章目录一、多线程同步竞争与协作互斥的概念同步的概念互斥与同步的实现和使⽤锁信号量⽣产者-消费者问题经典同步问题读者-写者问题一、多线程同步 竞争与协作 在单核 CPU 系统⾥&#xff0c;为了实现多个程序同时运⾏的假象&#xff0c;操作系统通常以时间⽚调度的⽅式&am…

为dev c++配置图形开发环境easyx之mingw32

easyx官方的文档在说明如何配置环境上面不太详细&#xff0c;所以就有了我的那篇博文为dev c配置图形开发环境easyx&#xff0c;默认的是在64位的编译器TDM-gcc下配置的&#xff0c;也就是我们配置的easyx最终都是放在mingw64文件夹下的&#xff0c;5.1版本后的dev c内置的编译…

什么是分层架构

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;微微的猪食小窝 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 微微的猪食小窝 原创 1、什么是架构分层&#xff1f; 分层架构是将软件模块按照水平切分的方式分成多个层&#xff0c;一个系统由多层组成…

同时安装Vue2和Vue3

背景 当我们的工作中使用的还是脚手架还是基于Vue2.x的版本&#xff0c;那么我们想要学习和使用Vue3怎么办&#xff1f;直接升级脚手架的话&#xff0c;会影响到我们现在的项目&#xff0c;那就需要去处理下关于Vue3的东西了。 下载安装Vue3的脚手架 任意磁盘根目录新建一个文件…

【深入理解C++】new/delete和new[]/delete[]探秘

文章目录1.operator new()和operator delete()2.new记录分配的内存大小供delete使用3.new[]/delete[]申请和释放一个数组3.1 基本数据类型&#xff08;内置类型&#xff09;3.2 自定义类型&#xff08;类类型&#xff09;4.new/delete和new[]/delete[]要配对使用1.operator new…

开发 Chrome 扩展 之 Hello World 心血来潮

开发 Chrome 扩展 Hello, World 项目加载未打包的扩展icon刷新引入 JS 与错误处理 开发 Chrome 扩展 开发 Chrome 扩展除了需要基本的 HTML, CSS, JS 之外, 还可以使用 Chrome 额外提供的 API. 除了需要的 .html, .css 和 .js 文件之外呢, 扩展还包括不同类型的文件, 具体可…

杨辉三角形(Java版)

不为失败找理由&#xff0c;只为成功找方法。所有的不甘&#xff0c;因为还心存梦想&#xff0c;所以在你放弃之前&#xff0c;好好拼一把&#xff0c;只怕心老&#xff0c;不怕路长。 文章目录1. 什么是杨辉三角形2. 实现思路&#xff08;方式&#xff09;2.1 递归方式2.2 递归…