您的位置:首页 > 其它

最大堆及优先队列的实现

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: