最大堆及优先队列的实现
2016-11-14 23:05
525 查看
最大堆的原理与实现比较简单,只需要用数组即可实现,下面给出我的实现版本
对于向上调整函数,向下调整函数的实现,我运用递归的方法。
/*
最大堆的实现(以int型为例)
成员函数:
一、向下调整函数
void MaxHeapSiftDown(MAX_HEAP &h, int i)
功能:将堆h中第i个元素向下调整
二、向上调整函数
void MaxHeapSiftUp(MAX_HEAP &h, int i)
功能:将堆h中第i个元素向上调整
三、弹出堆顶元素函数
void MaxHeapPop(MAX_HEAP &h)
功能:将堆h中最大元素删除
四、返回堆顶元素函数
int MaxHeapTop(MAX_HEAP h)
功能:返回堆h中的最大元素
五、插入函数
void MaxHeapPush(MAX_HEAP &h, int value)
功能:将值为value的元素插入堆h中
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn = 10000;
const int inf = 100000;
struct MAX_HEAP {
int heap[maxn];
int size;
}h;
void MaxHeapSiftDown(MAX_HEAP &h, int i)
{
int pos = i;
int L = 2 * i;
int R = 2 * i + 1;
if (L <= h.size && h.heap[L] > h.heap[pos])
pos = L;
if (R <= h.size && h.heap[R] > h.heap[pos])
pos = R;
if (pos != i) {
swap(h.heap[pos], h.heap[i]);
MaxHeapSiftDown(h, pos);
}
}
void MaxHeapSiftUp(MAX_HEAP &h, int i)
{
if (i > 1 && h.heap[i] > h.heap[i/2]) {
swap(h.heap[i], h.heap[i/2]);
MaxHeapSiftUp(h, i / 2);
}
}
void MaxHeapPush(MAX_HEAP &h, int value)
{
h.size++;
h.heap[h.size] = value;
MaxHeapSiftUp(h, h.size);
}
int MaxHeapTop(MAX_HEAP h)
{
if (h.size >= 1)
return h.heap[1];
else {
fprintf(stderr, "none element\n");
return -inf;
}
}
void MaxHeapPop(MAX_HEAP &h)
{
if (h.size >= 1) {
h.heap[1] = h.heap[h.size];
h.size--;
MaxHeapSiftDown(h, 1);
} else
fprintf(stderr, "the heap is empty");
return;
}
int main()
{
h.size = 0;
MaxHeapPush(h, 1);
MaxHeapPush(h, 8);
MaxHeapPush(h, 3);
MaxHeapPush(h, 5);
cout << MaxHeapTop(h) << endl ;
MaxHeapPop(h);
cout << MaxHeapTop(h) << endl;
MaxHeapPop(h);
MaxHeapPush(h, 11);
cout << MaxHeapTop(h) << endl;
MaxHeapPop(h);
cout << MaxHeapTop(h) << endl;
MaxHeapPop(h);
return 0;
}
对于向上调整函数,向下调整函数的实现,我运用递归的方法。
/*
最大堆的实现(以int型为例)
成员函数:
一、向下调整函数
void MaxHeapSiftDown(MAX_HEAP &h, int i)
功能:将堆h中第i个元素向下调整
二、向上调整函数
void MaxHeapSiftUp(MAX_HEAP &h, int i)
功能:将堆h中第i个元素向上调整
三、弹出堆顶元素函数
void MaxHeapPop(MAX_HEAP &h)
功能:将堆h中最大元素删除
四、返回堆顶元素函数
int MaxHeapTop(MAX_HEAP h)
功能:返回堆h中的最大元素
五、插入函数
void MaxHeapPush(MAX_HEAP &h, int value)
功能:将值为value的元素插入堆h中
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn = 10000;
const int inf = 100000;
struct MAX_HEAP {
int heap[maxn];
int size;
}h;
void MaxHeapSiftDown(MAX_HEAP &h, int i)
{
int pos = i;
int L = 2 * i;
int R = 2 * i + 1;
if (L <= h.size && h.heap[L] > h.heap[pos])
pos = L;
if (R <= h.size && h.heap[R] > h.heap[pos])
pos = R;
if (pos != i) {
swap(h.heap[pos], h.heap[i]);
MaxHeapSiftDown(h, pos);
}
}
void MaxHeapSiftUp(MAX_HEAP &h, int i)
{
if (i > 1 && h.heap[i] > h.heap[i/2]) {
swap(h.heap[i], h.heap[i/2]);
MaxHeapSiftUp(h, i / 2);
}
}
void MaxHeapPush(MAX_HEAP &h, int value)
{
h.size++;
h.heap[h.size] = value;
MaxHeapSiftUp(h, h.size);
}
int MaxHeapTop(MAX_HEAP h)
{
if (h.size >= 1)
return h.heap[1];
else {
fprintf(stderr, "none element\n");
return -inf;
}
}
void MaxHeapPop(MAX_HEAP &h)
{
if (h.size >= 1) {
h.heap[1] = h.heap[h.size];
h.size--;
MaxHeapSiftDown(h, 1);
} else
fprintf(stderr, "the heap is empty");
return;
}
int main()
{
h.size = 0;
MaxHeapPush(h, 1);
MaxHeapPush(h, 8);
MaxHeapPush(h, 3);
MaxHeapPush(h, 5);
cout << MaxHeapTop(h) << endl ;
MaxHeapPop(h);
cout << MaxHeapTop(h) << endl;
MaxHeapPop(h);
MaxHeapPush(h, 11);
cout << MaxHeapTop(h) << endl;
MaxHeapPop(h);
cout << MaxHeapTop(h) << endl;
MaxHeapPop(h);
return 0;
}
相关文章推荐
- Python实现最大优先队列
- 用最大堆实现优先队列(c++)
- 算法入门--最大堆实现优先队列
- 基于算法导论6.5用最大堆实现的优先队列(C++)
- heap实现的最大优先队列
- 基于最大堆的最大优先队列的实现(C语言)
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- [C++ 实现最大值优先队列和最小值优先队列]
- 算法笔记(堆实现的最大优先队列)
- 算法笔记(堆实现的最大优先队列)
- 优先队列的Java实现(最大二叉堆)
- 数据结构实现之最大索引优先队列
- 堆数据结构+堆排序+最大优先队列的堆的实现
- 用最大堆实现优先队列
- DataStructure之最大优先队列的java实现
- 优先队列的实现 Java数据结构与算法
- 离散化+区间更新+最大结点统计(或优先队列)——[usaco2010 Oct]Soda Machine
- 基于堆的优先队列的实现
- 基于大顶堆实现的最大优先级队列
- O(NlgK)问题优先队列实现文件C语言