//MaxHeap.h
#ifndef MAXHEAP_H_
#define MAXHEAP_H_
#define ElementType int
#define MAXDATA 1000
class MaxHeap
{
private:
ElementType *elem;
int size;
int capacity;
public:
MaxHeap(); //默认构造函数
MaxHeap(int MaxSize); //构造一个大小为MaxSize*ElementTye的堆
~MaxHeap(); //释放elem
bool IsFull(); //判断堆是否已满
bool IsEmpty(); //判断堆是是否为空
void Insert(ElementType item); //往插入元素
ElementType DeleteMax(); //删除堆中最大元素
void print(); //打印堆元素
};
#endif
//MaxHeap.cpp
#include "MaxHeap.h"
#include <iostream>
MaxHeap::MaxHeap()
{
int MaxSize = 100;
elem = new ElementType[MaxSize + 1];
size = 0;
capacity = MaxSize + 1;
elem[0] = MAXDATA;
}
MaxHeap::MaxHeap(int MaxSize)
{
elem = new ElementType[MaxSize + 1];
size = 0;
capacity = MaxSize + 1;
elem[0] = MAXDATA;
}
MaxHeap::~MaxHeap()
{
delete[] elem;
}
bool MaxHeap::IsFull()
{
if (size >= capacity)
return true;
else
return false;
}
bool MaxHeap::IsEmpty()
{
if (size == 0)
return true;
else
return false;
}
void MaxHeap::Insert(ElementType item)
{
//判断堆是否已满
if (IsFull())
{
std::cout << "最大堆已满" << std::endl;
return;
}
int i = ++size;
//将新元素放在堆最后,然后依次和父亲节点比较,换位置
for (; elem[i / 2] < item; i /= 2)
elem[i] = elem[i / 2];
elem[i] = item;
}
ElementType MaxHeap::DeleteMax()
{
//从最大堆中取出键值为最大的元素,并删除一个节点
int parent, child;
ElementType MaxItem, temp;
if (IsEmpty())
{
std::cout << "最大堆已为空" << std::endl;
return -1;
}
MaxItem = elem[1]; //取出根节点的最大值
//用最大堆中最后一个元素从根节点开始从向上过滤下层节点
temp = elem[size--];
for (parent = 1; parent * 2 <= size; parent = child)
{
child = 2 * parent;
if ((child != size) && elem[child] < elem[child + 1])
child++;
if (temp >= elem[child])
break;
else
elem[parent] = elem[child];
}
elem[parent] = temp;
return MaxItem;
return 0;
}
void MaxHeap::print()
{
for (int i = 1; i <= size; i++)
std::cout << elem[i] << " ";
}
////////////////////////////////////////////////////////
//测试
#include <iostream>
#include "MaxHeap.h"
using namespace std;
int main()
{
MaxHeap *h = new MaxHeap(100);
//构造堆
for (int i = 0; i < 100; i++)
h->Insert(i);
h->print(); //打印堆
cout << endl;
//得到堆排序的输出结果
for (int i = 0; i < 100; i++)
cout << h->DeleteMax() << " ";
cout << endl;
system("pause");
return 0;
}