堆结构、堆排序

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

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

把数组中从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;elselargest = left;if (arr[index] > arr[largest])largest = index;elselargest = 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.mzph.cn/news/866173.shtml

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

相关文章

Spring Bean生命周期

Bean生命周期&#xff1a; 创建 Bean 的实例&#xff1a;Bean 容器首先会找到配置文件中的 Bean 定义&#xff0c;然后使用 Java 反射 API 来创建 Bean 的实例。 Bean 属性赋值/填充&#xff1a;为 Bean 设置相关属性和依赖&#xff0c;例如Autowired 等注解注入的对象、Value…

强强联合!当RAG遇到长上下文,滑铁卢大学发布LongRAG,效果领先GPT-4 Turbo 50%

过犹不及——《论语先进》 大学考试时&#xff0c;有些老师允许带备cheet sheet&#xff08;忘纸条&#xff09;,上面记着关键公式和定义,帮助我们快速作答提高分数。传统的检索增强生成(RAG)方法也类似,试图找出精准的知识片段来辅助大语言模型(LLM)。 但这种方法其实有问题…

React@16.x(48)路由v5.x(13)源码(5)- 实现 Switch

目录 1&#xff0c;原生 Switch 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Switch 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; function News() {return <div className"p…

MySQL体系架构

1.1.MySQL的分支与变种 MySQL变种有好几个&#xff0c;主要有三个久经考验的主流变种&#xff1a;Percona Server&#xff0c;MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持&#xff0c;均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库&#xff0c;值…

JVM专题之Java对象内存模型

一个Java对象在内存中包括3个部分: 对象头、实例数据和对齐填充 数据 内存 -- CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩…

从零开始:大模型简介与应用|实战系列

实战系列 相信有不少伙伴对大模型有所耳闻&#xff0c;但也是一知半解&#xff0c;也许你知道很重要可以为自己的工作提供帮助但是不知道该如何结合&#xff0c;又或是转行的过程中并不知道从何入手&#xff0c;网上的教程要么不包含具体的操作步骤要么需要好几篇合在一起才能…

鸿蒙小案例-首选项工具类

一个简单的首选项工具类 主要提供方法 初始化 init()方法建议在EntryAbility-》onWindowStageCreate 方法中使用 没多少东西&#xff0c;放一下测试代码 import { PrefUtil } from ./PrefUtil; import { promptAction } from kit.ArkUI;Entry Component struct PrefIndex {St…

在window上搭建docker

1、打开Hyper-V安装 在地址栏输入控制面板&#xff0c;然后回车 勾选Hyper-V安装&#xff0c;如果没有找到Hyper-V&#xff0c;那么请走第2步 2、如果没有Hyper-V(可选&#xff09;第一步无法打开 家庭版本需要开启Hyper-V 创建一个文本文档&#xff0c;后缀名称为.bat.名称…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥生成介绍及算法规格】

密钥生成介绍及算法规格 当业务需要使用HUKS生成随机密钥&#xff0c;并由HUKS进行安全保存时&#xff0c;可以调用HUKS的接口生成密钥。 注意&#xff1a; 密钥别名中禁止包含个人数据等敏感信息。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harm…

【C++】 ——【模板初阶】——基础详解

目录 1. 泛型编程 1.1 泛型编程的概念 1.2 泛型编程的历史与发展 1.3 泛型编程的优势 1.4 泛型编程的挑战 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 2.6 函数模板的特化 2.7 函数模板的使…

html+css+js淘宝商品界面

点击商品&#xff0c;alert弹出商品ID 图片使用了占位符图片&#xff0c;加载可能会慢一点 你可以把它换成自己的图片&#x1f603;源代码在图片后面 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"…

时空预测+特征分解!高性能!EMD-Transformer和Transformer多变量交通流量时空预测对比

时空预测特征分解&#xff01;高性能&#xff01;EMD-Transformer和Transformer多变量交通流量时空预测对比 目录 时空预测特征分解&#xff01;高性能&#xff01;EMD-Transformer和Transformer多变量交通流量时空预测对比效果一览基本介绍程序设计参考资料 效果一览 基本介绍…

番外篇 | YOLOv8改进之即插即用全维度动态卷积ODConv + 更换Neck网络为GFPN

前言:Hello大家好,我是小哥谈。本文所做出的改进是在YOLOv8中引入即插即用全维度动态卷积ODConv和更换Neck网络为GFPN,希望大家学习之后能够有所收获~!🌈 目录 🚀1.基础概念 🚀2.网络结构 🚀3.添加步骤 🚀4.改进方法 🍀🍀步骤1:block.py文件修改…

在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头&#xff0c;实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点&#xff08;AP&#xff09;工作模式–Arduino程序&#xff0c;当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址&…

解析MySQL核心技术:视图的实用指南与实践案例

在数据库管理中&#xff0c;MySQL视图&#xff08;View&#xff09;是一种强大的功能&#xff0c;利用它可以简化复杂查询、提高数据安全性以及增强代码的可维护性。本篇文章将详细介绍MySQL视图的相关知识&#xff0c;包括视图的创建、修改、删除、使用场景以及常见的最佳实践…

Python学生信息管理系统(完整代码)

引言&#xff1a;&#xff08;假装不是一个大学生课设&#xff09;在现代教育管理中&#xff0c;学生管理系统显得尤为重要。这种系统能够帮助教育机构有效地管理学生资料、成绩、出勤以及其他教育相关活动&#xff0c;从而提高管理效率并减少人为错误。通过使用Python&#xf…

亚马逊跟卖选品erp采集,跟卖卖家的选品利器,提升选品效率!

今天给亚马逊跟卖卖家&#xff0c;分享我现在在用的两种选品方式&#xff0c;做个铺货或者是跟卖都可以&#xff0c;是不是很多卖家选品现在都是亚马逊前端页面或是新品榜单选择产品跟卖&#xff0c;这样找品这就相当于大海捞针&#xff0c;而且新品榜单的产品你能看到那其他卖…

经典卷积神经网络 LeNet

一、实例图片 #我们传入的是28*28&#xff0c;所以加了padding net nn.Sequential(nn.Conv2d(1, 6, kernel_size5, padding2), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Flat…

Linux Swap机制关键点分析

1. page被swap出去之后,再次缺页是怎么找到找个换出的页面? 正常内存的页面是通过pte映射找到page的,swap出去的page有其特殊的方式:swap的页面page->private字段保存的是:swap_entry_t通过swap_entry_t就能找到该页面的扇区号sector_t,拿到扇区号就可以从块设备中读…