堆结构、堆排序

news2025/1/17 8:51:40

是完全二叉树,类似这种样式的
在这里插入图片描述
而这种有右子节点,没左子节点的就不是完全二叉树
在这里插入图片描述

分为大根堆和小根堆
大根堆是二叉树里每一颗子树的父节点都是这颗子树里最大的,即每一棵子树最大值是头节点的值
小根堆相反

把数组中从0开始的一段数人为想为完全二叉树
在这里插入图片描述

某一节点的数在数组中的索引是i,
则它的父节点为(i-1)/2,
它的左子节点为(2i+1),
右子节点为(2
i+2)

堆结构的两种重要操作

向大根堆中添加一个数,heapinsert

如何把完全二叉树转化为大根堆(或者小根堆)
用一个变量记录当数组中从0开始的几个数是堆,heapsize,
1、开始时heapsize=0,即空堆,进来一个新数时,把新数放在堆的heapsize=0位置,此时heapsize=1
2、继续进新数放在heapsize=1位置,heapsize=2,然后新书和它的父节点进行比较,若小于等于父节点则不变,若大于父节点,则和父节点交换,交换之后继续和它的父节点比较,直到没父节点大或者到堆的顶了
3、进来新数继续重复上述操作

void heapInsert(int* arr, int index)
{
	while (arr[index] > arr[(index - 1) / 2])
	{
		swap2(arr[index], arr[(index - 1) / 2]);
		index = (index - 1) / 2;
	}
}

返回大根堆的最大值并移除,heapify

去掉大根堆的最大值,就是去掉最上面的数,用一个变量记录一下这个数,然后把大根堆最后一个数和该数进行交换,交换之后heapsize-1,然后头节点与左子节点和右子节点进行比较,三者中最大的左头节点,并交换,继续向下比直到该数大于左子节点和右子节点或者没有子节点

void heapIfy(int* arr, int index, int heapsize)//index是指从哪个位置往下做heapify
{
	int left = 2 * index + 1;
	while (left < heapsize)//该位置有左子节点
	{
		int largest;
		if ((left + 1 < heapsize) && (arr[left + 1] > arr[left]))//右子节点存在
			largest = left + 1;
		else
			largest = left;
		if (arr[index] > arr[largest])
			largest = index;
		else
			largest = largest;
		if (largest == index) break;
		swap2(arr[index], arr[largest]);//将父节点上和较大子节点的数交换
		index = largest;//交换后继续向下移进行比较
		left = 2 * index + 1;
	}
}

堆排序

先把数组变成大根堆,然后把最大数和最后位置上的数做交换,heapsize–,,此时最大值就到最后一位了,重复上述操作

void heapSort(int* arr, int L, int R)
{
	if (L >= R) return;
	//int heapsize = 0;
	for (int i = L; i < R + 1; i++)
	{
		heapInsert(arr, i);
		//heapsize++;
	}
	int heapsize = R -L + 1;
	while (heapsize > 0)
	{
		swap2(arr[L], arr[heapsize - 1]);
		heapsize = heapsize - 1;
		heapIfy(arr, L, heapsize);
	}
}

堆排序拓展题目

已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序

比如k=6,先把数组中前7个数放到小根堆中,即0-6位置的数,在排完序之后,小根堆的最小值在0位置,因为k=6,所以7位置和7位置之后的数在排序时不会移动到0位置,所以排序后0位置上的数也是数组的最小值,把该数弹出

把7位置上的数加入到小根堆,此时最小值在1位置上,依次往后进行压数,弹数
使用系统自带的最小堆

void min_heapSortPlus(int* arr, int L, int R, int k)
{
	priority_queue<int, vector<int>, greater<int>> min_heap;
	int index = L;
	for (; index < L + k + 1; index++)
	{
		min_heap.push(arr[index]);
	}
	int i = 0;
	for (; index < R + 1; i++, index++)
	{
		arr[L + i] = min_heap.top();
		min_heap.push(arr[index]);
		min_heap.pop();
	}
	while (!min_heap.empty())
	{
		arr[L + i] = min_heap.top();
		min_heap.pop();
		i++;
	}
}

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

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

相关文章

记录OSPF配置,建立邻居失败的过程

1.配置完ospf后&#xff0c;在路由表中不出现ospf相关信息 [SW2]ospf [SW2-ospf-1]are [SW2-ospf-1]area 0 [SW2-ospf-1-area-0.0.0.0]net [SW2-ospf-1-area-0.0.0.0]network 0.0.0.0 Jul 4 2024 22:11:58-08:00 SW2 DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5.25 .1…

艺活网DIY手工制作网站源码 工艺制作教程平台源码,带数据

帝国CMS仿《手艺活》DIY手工制作网源码&#xff0c;仿手艺活自适应手机版模板。 带数据库和图片资源&#xff0c;一共5个G大小&#xff0c;下载需耐心。 92开发 手艺活网DIY手工制作网站源码 创意手工艺品制作教程平台系统帝国h5自适应手机端 是一套展示各种 DIY 小物品精美又…

PhysioLLM 个性化健康洞察:手表可穿戴设备实时数据 + 大模型

个性化健康洞察&#xff1a;可穿戴设备实时数据 大模型 提出背景PhysioLLM 图PhysioLLM 实现数据准备用户模型和洞察生成个性化数据总结和洞察是如何生成的&#xff1f; 解析分析 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.19283 虽然当前的可穿戴设备伴随应用&…

vue目录说明

vue目录说明 主要目录说明 .vscode - - -vscode工具的配置文件夹 node_modules - - - vue项目的运行依赖文件夹 public - - -资源文件夹&#xff08;浏览器图标&#xff09; src- - -源码文件夹 .gitignore - - -git忽略文件 index.html - - -入口html文件 package.json - - -…

SQL执行慢排查以及优化思路

数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1f;我把思考的流程整理成了下面这张图。 整个流程划分成了观察&#xff08;Show status&#xff09;和行动&#xff08;Action&#xff09;两个部分。字母 S 的部分代表观察&#xf…

项目管理实用表格与应用【项目文件资料分享】

项目管理基础知识 项目管理可分为五大过程组&#xff08;启动、规划、执行、监控、收尾&#xff09;十大知识领域&#xff0c;其中包含49个子过程 项目十大知识领域分为&#xff1a;项目整合管理、项目范围管理、项目进度管理、项目成本管理、项目质量管理、项目资源管理、项目…

使用 iconfont.ttf文件保存多个图标文件,并且像文字一样使用代码绘制出来

先看演示效果 这里的多个图标其实是存储在 iconfont.ttf文件中 这个文件里面的图标对应的编码 显示代码 void CMFCApplication3Dlg::OnBnClickedOk() {// 加载字体文件CString fontPath = _T("C:\\Users\\35497\\Desktop\\test\\MFCApplication3\\font\\iconfont.ttf&qu…

searchForm自适应布局 + 按钮插槽

收起 展开 代码&#xff1a; useResizeObserverHooks.js import { useEffect, useLayoutEffect } from "react";export const useResizeObserver (containerDom, domClass, callback) > {useLayoutEffect(() > {let resizeObserver null;let dom null;if …

8人团队历时半年打造开源版GPT-4o,零延迟演示引爆全网!人人可免费使用!

目录 01 Moshi 02 背后技术揭秘 GPT-4o可能要等到今年秋季才会公开。 然而&#xff0c;由法国8人团队开发的原生多模态Moshi&#xff0c;已经达到了接近GPT-4o的水平&#xff0c;现场演示几乎没有延迟&#xff0c;吸引了大量AI专家的关注。 令人惊讶的是&#xff0c;开源版的…

代码随想录算法训练营第69天:图论7[1]

代码随想录算法训练营第69天&#xff1a;图论7 109. 冗余连接II 卡码网题目链接&#xff08;ACM模式&#xff09;(opens new window) 题目描述 有向树指满足以下条件的有向图。该树只有一个根节点&#xff0c;所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节…

AI大模型:解锁未来职业竞争力的金钥匙

AI元年&#xff1a;大模型的革新力量 随着ChatGPT的震撼登场&#xff0c;2023年被标记为AI元年&#xff0c;大模型以其前所未有的影响力&#xff0c;重塑我们的日常生活和工作方式。从日常的问答对话到复杂的编程辅助&#xff0c;乃至创意图像生成&#xff0c;AI大模型展现出超…

怎么还有人分不清路由器、交换机、光猫、WiFi……你真的都了解吗?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 讲某个具体技术&#xff0c;说不定你头头是道&#xff0c;但关于路由器、交换机、光猫、WiFi的知识细节&…

AI PC(智能电脑)技术分析

一文看懂AI PC&#xff08;智能电脑&#xff09; 2024年&#xff0c;英特尔、英伟达等芯片巨头革新CPU技术&#xff0c;融入AI算力&#xff0c;为传统PC带来质的飞跃&#xff0c;引领智能计算新时代。 2024年&#xff0c;因此被叫作人工智能电脑&#xff08;AI PC&#xff09;…

我尝试了新的 OpenAI 连接器,真太棒了!

我们上个月发布的新连接器将 Open AI 集成简化为仅需几步操作。我实现了聊天完成 API&#xff08;有和没有上下文&#xff09;&#xff0c;并想编写一个关于其工作原理的快速教程。 先决条件 与往常一样&#xff0c;在进入主要构建之前我们需要做一些准备工作。你会需要&…

FFT 简单基础(matlab

使用 fs 进行采样&#xff0c;进行 N点FFT 选择显示0~N/21点的幅值 横坐标对应频率计算公式&#xff1a; fs * n / N 举个梨子&#xff1a; 频率2kHz采样1s&#xff0c;得到2000个点的序列y(n) 对序列y(n)做4096点的FFT 幅值响应对应的横坐标频率…

隐私信息管理体系认证:守护个人信息,筑牢隐私防线

在数字化浪潮汹涌的当下&#xff0c;个人信息安全问题愈发凸显其重要性。随着互联网技术的飞速发展&#xff0c;我们的隐私信息如同裸露在阳光下的沙滩&#xff0c;稍有不慎就可能被不法分子窃取或滥用。因此&#xff0c;构建一个完善的隐私信息管理体系&#xff0c;成为了保障…

实现第一个神经网络

PyTorch 包含创建和实现神经网络的特殊功能。在本节实验中&#xff0c;将创建一个简单的神经网络&#xff0c;其中一个隐藏层开发一个输出单元。 通过以下步骤使用 PyTorch 实现第一个神经网络。 第1步 首先&#xff0c;需要使用以下命令导入 PyTorch 库。 In [1]: import…

免费通配符/泛域名SSL证书快速申请攻略

在互联网时代&#xff0c;网站安全的重要性日益凸显&#xff0c;而SSL证书作为保障网站安全的关键工具&#xff0c;其重要性不言而喻。对于拥有多个子域名的网站来说&#xff0c;通配符/泛域名SSL证书更是必不可少的安全保障。下面将介绍如何申请免费的通配符/泛域名SSL证书。 …

EXTI寄存器,AFIO的简洁,EXTI配置的流程

一&#xff0c;AFIO简介 AFIO是Alternate Function Input/Output 的缩写&#xff0c;表示复用功能IO&#xff0c;主要用于实现IO端口的复用功能以及外部中断的控制 STM32外设有很多I/O以及内置外设&#xff08;如12C&#xff0c;ADC,ISP,USART等&#xff09;。为节省引出管脚的…