草庐IT

数据结构:堆的应用(堆排序和topk问题)

个人主页:个人主页个人专栏:《数据结构》《C语言》文章目录堆排序建堆堆的删除思想排序代码实现topk问题思路代码实现总结堆排序堆排序即是先将数据建堆,再利用堆删除的思想来排序。将待排序数组建堆将堆顶数据与数组尾部数据交换调整新的堆顶数据,使其保证堆的结构不变重复2,3步直到堆中没有数据结束。建堆降序建小堆(父节点小于等于子节点)升序建大堆(父节点大于等于子节点)建堆有两种思路,向上建堆和向下建堆。其中向下建堆优于向上建堆。向下建堆:从最后一个子节点的父节点开始向前遍历待排序数组,不断向下调整。如下:对数组{16,72,31,94,53,23}建小堆为什么不能从数组首元素开始呢?因为向下调整的前

数据结构---手撕图解堆的实现和TopK的应用

文章目录重要的概念树的存储方式顺序存储链式存储堆的概念堆的实现向上调整算法一些实现过程中的技巧实现搭建堆实现出堆的操作向下调整算法堆排序TopK重要的概念要讲到堆,先要说两个关于二叉树的概念满二叉树:一个二叉树如果每一层的节点数都是最大值,那么这个二叉树就是满二叉树完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是满二叉树的变形,对于深度为k的树有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号从1至n的节点上面所展示的就是满二叉树和完全二叉树树的存储方式顺序存储任何一个数据结构在内存中都要以一定的方式存储起来,那么具体如何存储起来?有下面的规则首先是顺序存储,也就是用

堆排序+TopK问题——“数据结构与算法”

各位CSDN的uu们你们好呀,好久不见,停更了很长一段时间吧,最近小雅兰会开始慢慢更新起来的,下面,就进入小雅兰今天的分享的知识点吧,让我们一起进入堆的世界!!!堆排序——(1)heap.h的内容:#pragmaonce#include#include#include#includetypedefintHeapDataType;typedefstructHeap{ HeapDataType*a; intsize; intcapacity;}Heap;//堆的初始化voidHeapInit(Heap*php);//堆的销毁voidHeapDestroy(Heap*php);//插入数据voidH

【TopK问题】——用堆实现

文章目录一、TopK问题是什么二、解决方法三、时间复杂度一、TopK问题是什么TopK问题就是从1000个数中找出前K个最大的数或者最小的数这样的类似问题。不过并不要求这k个数字必须是有序的,如果题目有要求,则进行堆排序即可。还有比如求出全国玩韩信前十名等等,排出班级前十名也是TopK问题。二、解决方法采用堆的方式可以较快解决。思路:如果需要排前k个最大的数,则需要建一个小堆如果需要排前k个最小的数,则需要建一个大堆假设现在需要排序前k个最大的数,则需要建立一个小堆。建立小堆是拿n个数的前k个数来建立的。不能把n个数全部建立成一个小堆,这样效率会大打折扣,因为通过向下调整建堆的时间复杂度是O(

【TopK问题】——用堆实现

文章目录一、TopK问题是什么二、解决方法三、时间复杂度一、TopK问题是什么TopK问题就是从1000个数中找出前K个最大的数或者最小的数这样的类似问题。不过并不要求这k个数字必须是有序的,如果题目有要求,则进行堆排序即可。还有比如求出全国玩韩信前十名等等,排出班级前十名也是TopK问题。二、解决方法采用堆的方式可以较快解决。思路:如果需要排前k个最大的数,则需要建一个小堆如果需要排前k个最小的数,则需要建一个大堆假设现在需要排序前k个最大的数,则需要建立一个小堆。建立小堆是拿n个数的前k个数来建立的。不能把n个数全部建立成一个小堆,这样效率会大打折扣,因为通过向下调整建堆的时间复杂度是O(

【数据结构与算法】堆的应用:堆排序和topk问题

目录一.堆排序二.topk问题一.堆排序我们知道冒泡算法的时间复杂度是O(N^2),在数据量很多的时候,N^2是个很可怕的数字,二分算法的时间复杂度是O(logn),但是二分算法有限制条件,实用性并不高,那怎样才能高效实用的排序呢?堆排序就能很好解决上述问题,堆排序的时间复杂度是O(logn),也没啥限制条件,可以实现高效排序。这里要注意,排升序要建大堆,排降序要建小堆;1.假设排升序,所以建大堆;2.堆建好后,定义一个end变量,令其=n-1(数组最后一个元素的下标是n-1);3.堆建好后,数组第一个元素就是最大的,将其与最后一个数据交换,然后这个数据就不需要动了,为了保持它是个大堆,让它的

【数据结构与算法】堆的应用:堆排序和topk问题

目录一.堆排序二.topk问题一.堆排序我们知道冒泡算法的时间复杂度是O(N^2),在数据量很多的时候,N^2是个很可怕的数字,二分算法的时间复杂度是O(logn),但是二分算法有限制条件,实用性并不高,那怎样才能高效实用的排序呢?堆排序就能很好解决上述问题,堆排序的时间复杂度是O(logn),也没啥限制条件,可以实现高效排序。这里要注意,排升序要建大堆,排降序要建小堆;1.假设排升序,所以建大堆;2.堆建好后,定义一个end变量,令其=n-1(数组最后一个元素的下标是n-1);3.堆建好后,数组第一个元素就是最大的,将其与最后一个数据交换,然后这个数据就不需要动了,为了保持它是个大堆,让它的

八大排序算法之堆排序的实现+经典TopK问题

目录一.堆元素的上下调整接口1.前言2.堆元素向上调整算法接口3.堆元素向下调整算法接口二.堆排序的实现1.空间复杂度为O(N)的堆排序(以排升序为例)思路分析:代码实现:排序测试:​时空复杂度分析:2.空间复杂度为O(1)的堆排序(以排降序为例)将数组arr调整成堆的思路:将数组arr调整成堆的时间复杂度分析: ​在数组arr数组被调整成堆的基础上完成排序的思路堆排序代码实现:排序时空复杂度分析:三.用堆数据结构解决TopK问题1. 问题描述: 2.问题分析与求解 一.堆元素的上下调整接口1.前言完全二叉树的物理结构和逻辑结构:关于堆和堆元素上下调整算法接口的设计原理分析参见青菜的博客htt

八大排序算法之堆排序的实现+经典TopK问题

目录一.堆元素的上下调整接口1.前言2.堆元素向上调整算法接口3.堆元素向下调整算法接口二.堆排序的实现1.空间复杂度为O(N)的堆排序(以排升序为例)思路分析:代码实现:排序测试:​时空复杂度分析:2.空间复杂度为O(1)的堆排序(以排降序为例)将数组arr调整成堆的思路:将数组arr调整成堆的时间复杂度分析: ​在数组arr数组被调整成堆的基础上完成排序的思路堆排序代码实现:排序时空复杂度分析:三.用堆数据结构解决TopK问题1. 问题描述: 2.问题分析与求解 一.堆元素的上下调整接口1.前言完全二叉树的物理结构和逻辑结构:关于堆和堆元素上下调整算法接口的设计原理分析参见青菜的博客htt

数据结构学习分享之堆的详解以及TopK问题

💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:数据结构学习分享⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你了解更多数据结构的知识 🔝🔝数据结构第七课1.前言🚩2.堆的概念以及结构🚩3.堆的实现🚩3.1初始化结构🏴3.2初始化函数🏴3.3插入函数🏴3.4向上调整函数🏴3.5删除函数🏴3.6向下调整函数🏴3.7其他函数🏴4.TopK问题🚩4.1思路分析🏴4.2代码实现🏴4.3算法效率🏴5.总结🚩1.前言🚩本章就给大家带来久违的堆的知识,如果你还不知道数的相关知识,或者什么是完全二叉树,请跳转树的介绍,本章的堆结构需要树的知识做铺垫.数据结构中的堆结构本质上就是一种完全二叉树,我们上一章