数据结构(8) -- 堆

//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;
}
原文地址:https://www.cnblogs.com/yongssu/p/4402796.html