大根堆小根堆

2024-01-04 23:28
文章标签 大根堆 根堆

本文主要是介绍大根堆小根堆,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

偷学的罒ω罒,非常好用的模版,分享一下。学过堆排应该很容易就看懂了,看不懂学一下堆排,不好懂的地方我也写了注释

小根堆

template<typename T>
class smallest_heap {
private://建堆T heap[10001];int len;
public:smallest_heap();void push(T const&);void pop();T top();int size();bool empty();
};
template<typename T>
smallest_heap<T>::smallest_heap() {len = 0;memset(heap, 0, sizeof(heap));
}
template<typename T>
void smallest_heap<T>::push(T const& n) {//将元素添加到堆尾heap[++len] = n;int son = len, father = son / 2;//由于是建立小根堆,当子节点小于父节点时,且父节点要大于等于最小下标while (heap[son] < heap[father] && father >= 1) {//交换std::swap(heap[son], heap[father]);//不断往上交换son = father, father = son / 2;}
}
//删除堆顶元素
template<typename T>
void smallest_heap<T>::pop() {//交换首元素和尾元素std::swap(heap[1], heap[len]);//将最后一个元素置0heap[len--] = 0;int father = 1, son = 2;//当子元素下标不超过最后一个while (son <= len) {//这一行用于找到当前节点的左右孩子中值较小的那一个,将其索引赋给 son。if (son<len && heap[son]>heap[son + 1])son++;//有序堆,只需要找到一个heap[son]>heap[father]的节点,否则就往上交换if (heap[father] > heap[son]) {std::swap(heap[father], heap[son]);father = son, son = father * 2;}else break;}
}
template<typename T>
T smallest_heap<T>::top() {return heap[1];
}
template<typename item>
int smallest_heap<item>::size() {return len;
}template<typename item>
bool smallest_heap<item>::empty() {return len;
}

很容易找到堆里的最小元素。

大根堆,改三个大于小于号就好了

template<typename T>
class smallest_heap {
private://建堆T heap[10001];int len;
public:smallest_heap();void push(T const&);void pop();T top();int size();bool empty();
};
template<typename T>
smallest_heap<T>::smallest_heap() {len = 0;memset(heap, 0, sizeof(heap));
}
template<typename T>
void smallest_heap<T>::push(T const& n) {heap[++len] = n;int son = len, father = son / 2;//1.大根堆改这里<改成>while (heap[son] > heap[father] && father >= 1) {//交换std::swap(heap[son], heap[father]);//不断往上交换son = father, father = son / 2;}
}
//删除堆顶元素
template<typename T>
void smallest_heap<T>::pop() {//交换首元素和尾元素std::swap(heap[1], heap[len]);//将最后一个元素置0heap[len--] = 0;int father = 1, son = 2;//当子元素下标不超过最后一个while (son <= len) {//大根堆改这,>改成<if (son<len && heap[son]<heap[son + 1])son++;//这里同理if (heap[father] < heap[son]) {std::swap(heap[father], heap[son]);father = son, son = father * 2;}else break;}
}
template<typename T>
T smallest_heap<T>::top() {return heap[1];
}
template<typename item>
int smallest_heap<item>::size() {return len;
}template<typename item>
bool smallest_heap<item>::empty() {return len;
}

这篇关于大根堆小根堆的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570928

相关文章

[Leetcode 230][Medium] 二叉搜索树中第 K 小的元素-大根堆/优先队列/DFS深度优先搜索

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 题目地址 二、整体思路         大根堆/优先队列         看到第K小的元素(Top K)问题,第一时间想到快速排序/大根堆/优先队列。比较简单的思路是把所有结点加入到优先队列,然后重复出队列操作使得队列中元素数量为k,此时队首元素即为第K小的元素。优先队列的数据结构是大根堆,在遇见比堆顶小的元

数据结构 之 堆(完全二叉树、大根堆、小根堆)

堆是一种完全二叉树结构,这意味着它具有完全二叉树的性质,其中一点如下所示: 设完全二叉树的一元素编号为i,1 <= I <= n,n为元素总数。有以下关系成立:1、如果i=1,则该元素为二叉树的根节点,若i>1,则其父节点的编号为(int)(i/2);2、如果2*i > n,则该元素无左孩子。否则,其左孩子的编号为2 * i;3、如果1 + 2*i > n ,则该元素无右孩子,否则,其右孩

大根堆 小根堆

转:小根堆大根堆  堆(Heap)分为小根堆和大根堆两种,对于一个小根堆,它是具有如下特性的一棵完全二叉树:       (1)若树根结点存在左孩子,则根结点的值(或某个域的值)小于等于左孩子结点的值(或某个域的值);       (2)若树根结点存在右孩子,则根结点的值(或某个域的值)小于等于右孩子结点的值(或某个域的值);       (3)以左、右孩子为根的子树又各是一个堆。

【java数据结构之八大排序(上)-直接插入排序,希尔排序,选择排序,堆排序,向下调整(大根堆,小根堆)等知识详解】

🌈个人主页:努力学编程’ ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 hello,今天带大家学数据结构的一个非常重要的部分,排序!!!,回想博主的学习路程 ,好像真正学过的排序就是冒泡排序,其实数据结构里面有很多的排序的算法,针对不同的数据,我们往往采用不同的排

二叉堆 | 大根堆 小根堆

目录 何为二叉堆 二叉堆的调整  最大堆 最大堆的插入操作 最大堆的删除操作  最大堆的构建 最大堆code 最小堆  小根堆的插入操作 最小堆的删除操作  最小堆的构建 最小堆code  二叉堆的存储方式 何为二叉堆 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆最小堆  二叉堆的调整  对于二叉堆,如下有几种操作: 插入节点:无论是大根堆还是小

js实现的大根堆算法(基于链式的m叉树)

面向过程版本 var COUNT = 3;/*获取待排序数据,数据的个数和值随机生成*/function getData() {var arr = [];var i = 0;var len = Math.max(10, ~~(Math.random() * 30 ));while(i < len) {arr.push(~~(Math.random() * 100 ));i++;} r

C++ 优先级队列(大小根堆)OJ

目录 1、 1046. 最后一块石头的重量 2、 703. 数据流中的第 K 大元素         为什么小根堆可以解决TopK问题?  3、 692. 前K个高频单词 4、 295. 数据流的中位数 1、 1046. 最后一块石头的重量  思路:根据示例发现可以用大根堆(降序)模拟这个过程。 class Solution {public:int lastSt

数据结构笔记--优先队列(大小根堆)经典题型

1--项目的最大利润 题目描述:         输入:正数数组 costs,costs[i] 表示项目 i 的花费;正数数组 profits,profits[i] 表示项目 i 的花费;正数 k 表示只能串行完成最多 k 个项目;m 表示拥有的资金,每完成一个项目后资金会立即更新(原始资金 + 利润);         输出:求解最后获得的最大利润; 主要思路:         小根

C#最优队列最小堆小顶堆大顶堆小根堆大根堆PriorityQueue的使用

最优队列有多种叫法,什么小根堆,大根堆,小顶堆,大顶堆。 队列分多种,线性队列(简单队列),循环队列,最优队列等等。 最优队列,可以看作堆叠箱子,越小的越在上面,或者最大的越在上面。目的就是求出前面最值。比如最大的前3个,或最小的前3个。 framework中只能自己创建类,或者变通由sortedset等来做,现在.net6及以后有了。 下面由.net8(反正它也长期被支持了,就用它吧

牛客网 哈夫曼树 (大根堆、哈夫曼树)

输入描述: 输入有多组数据。 每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。 输出描述: 输出权值。 输入 5 1 2 2 5 9 输出 37 Solution 哈弗曼树板题。注意默认优先队列为大根堆,小根堆用priority_queue<int, vector<int>, greater<int>> Q; #include <al