最大堆的原理與實現比較簡單,只需要用數組即可實現,下面給出我的實現版本
對於向上調整函數,向下調整函數的實現,我運用遞歸的方法。
/*
最大堆的實現(以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;
}