美文网首页
大师兄的数据结构学习笔记(七):堆

大师兄的数据结构学习笔记(七):堆

作者: superkmi | 来源:发表于2020-10-27 08:40 被阅读0次

大师兄的数据结构学习笔记(六):树的应用
大师兄的数据结构学习笔记(八): 哈夫曼树与哈夫曼编码

一、什么是堆(Heap)

  • 可以看作是一个数组表示的完全二叉树。
  • 堆总是满足下列性质:

1) 堆中某个节点的值总是不大于或不小于其父节点的值。
2) 堆总是一棵完全二叉树。

  • 将根节点最大的堆叫做最大堆(MaxHeap)。


  • 根节点最小的堆叫做最小堆(MinHeap)。


二、堆的抽象数据类型描述

  • 操作集:最大堆H \in MaxHeap,元素item \in ElementType
  • 主要操作有:
操作 说明
MaxHeap Create(int MaxSize) 创建一个空的最大堆。
Boolean IsFull(MaxHeap H) 判断最大堆H是否已满。
Insert(MaxHeap H,ElementType item) 将元素item插入最大堆H。
Boolean IsEmpty(MaxHeap H) 判断最大堆H是否为空。
ElementType DeleteMax(MaxHeap H) 返回H中最大元素。

三、堆的实现

#ifndef MAXHEAP
#define MAXHEAP
#include<vector>
using namespace std;

template<class T>
class MyMaxHeap
{
public:
    MyMaxHeap(T data[], int len);   //构造函数
    MyMaxHeap(int capacity);        //构造一个空堆
    ~MyMaxHeap(){};                 //析构函数
    bool IsFull();                  //判断最大堆H是否已满。
    void Insert(T item);        //将元素item插入最大堆H。
    bool IsEmpty();                 //判断最大堆H是否为空
    T DeleteMax();          //返回最大元素

private:
    vector<T>_vecdata;
    int _size;                      //元素数量
    int _capacity;                  //堆的大小
    void _swap(int i, int j );      //元素交换
    void _sink(int index);          //元素下沉
    void _floating(int index);      //元素上浮
};

#endif
#include <iostream>
#include "heap.h"
using namespace std;
//构造函数
template <class T>
MyMaxHeap<T>::MyMaxHeap(T data[], int len) :_size(0), _capacity(len)
{
    _vecdata.resize(_capacity);
    for (int i = 0; i < len; i++)
    {
        if (IsFull())
        {
            cout << "MaxHeap is full!" << endl;
        }
        else
        {
            _vecdata[_size] = data[i];
            ++_size;
            _floating(_size);
        }
    }
}

template <class T>
//构造一个空堆
MyMaxHeap<T>::MyMaxHeap(int capacity) :_size(0), _capacity(capacity)
{
    _vecdata.resize(_capacity);
}

template <class T>
//判断最大堆H是否已满
bool MyMaxHeap<T>::IsFull()
{
    if (_capacity == _size)
        return true;
    return false;
}

template <class T>
//将元素item插入最大堆H
void MyMaxHeap<T>::Insert(T item)
{
    if (IsFull())
    {
        cout << "the MaxHeap is full!!" << endl;
        return;
    }
   
    _vecdata[_size] = item;
    ++_size;
    _floating(_size);
}

template <class T>
//判断最大堆H是否为空
bool MyMaxHeap<T>::IsEmpty()
{
    return _size == 0;
}

template <class T>
//返回最大元素
T MyMaxHeap<T>::DeleteMax()
{
    if (IsEmpty())
    {
        cout << "the MaxHeap is empty!" << endl;
        return nullptr;
    };
    T max_data = _vecdata[0];
    _vecdata[0] = _vecdata[_size - 1];
    --_size;
    _sink(_size + 1);
    return max_data;
}

template <class T>
//元素交换
void MyMaxHeap<T>::_swap(int i, int j)
{
    T temp = _vecdata[i];
    _vecdata[i] = _vecdata[j];
    _vecdata[j] = temp;
    return;
}

template <class T>
//元素下沉
void MyMaxHeap<T>::_sink(int index)
{
    int i = index;
    while (i * 2 <= _size)
    {
        //对比左节点
        if (_vecdata[i - 1] < _vecdata[i * 2 - 1])
        {
            _swap(i - 1, i * 2 - 1);
            if (i * 2 + 1 <= _size && _vecdata[i - 1] < _vecdata[i * 2])
                _swap(i - 1, i * 2);
            i = i * 2;
        }
        //对比右节点
        else if (i * 2 + 1 <= _size && _vecdata[i - 1] < _vecdata[i * 2])
        {
            _swap(i - 1, i * 2);
            i = i * 2 + 1;
        }
        else
            break;
    }
}

template <class T>
//元素上浮
void MyMaxHeap<T>::_floating(int index)
{
    if (_size == 1)
        return;
    for (int i = index; i > 0; i *= 0.5)
    {
        if (_vecdata[i - 1] > _vecdata[i * 0.5 - 1])
            _swap(i - 1, i * 0.5 - 1);
        else
            break;
    }
}

相关文章

网友评论

      本文标题:大师兄的数据结构学习笔记(七):堆

      本文链接:https://www.haomeiwen.com/subject/lcmvmktx.html