practice Max.h文件

#ifndef PRACTICE_MAX_H_INCLUDED
#define PRACTICE_MAX_H_INCLUDED


template <class T>


class MaxHeap
{
public:
      MaxHeap(int mx=100);
      virtual ~MaxHeap();
      bool IsEmpty();
      void Push(const T& e);
      void Pop();
      const T& Top() const;
private:
    T* heapArray;
    int maxSize;
    int currentSize;
    void trickleUp(int index);
    void trickleDown(int index);
};

template<class T>
MaxHeap<T>::MaxHeap(int mx)
{
    if(mx<1) throw"max size must be>1";

    maxSize=mx;
    currentSize=0;
    heapArray=new T[maxSize];
}
template<class T>
MaxHeap<T>::~MaxHeap()
{
    delete[] heapArray;
}
template<class T>
bool MaxHeap<T>::IsEmpty()
{

    return currentSize==0;
}

template<class T>
void MaxHeap<T>::Push(const T& e)  //插入一个值
{
    if(currentSize==maxSize)  throw"MaxHeap is full";

    heapArray[currentSize]=e;
    trickleUp(currentSize);
    currentSize++;

}

template <class T>
void MaxHeap<T>::trickleUp(int index)//向上渗透¸
{
    int parent=(index-1)/2;
    T bottom=heapArray[index];
    while(index>0&&heapArray[parent]<bottom)
    {
        heapArray[index]=heapArray[parent];
        index=parent;
        parent=(parent-1)/2;

    }
    heapArray[index]=bottom;

}

template<class T>
const T & MaxHeap<T>::Top() const//取出第一个值
{

    return heapArray[0];
}
template <class T>
void MaxHeap<T>::Pop()
{

    heapArray[0]=heapArray[--currentSize];
    trickleDown(0);

}
template<class T>
void MaxHeap<T>::trickleDown(int index)//先下渗透
{
    int largerChild;
    T top=heapArray[index];
    while(index<currentSize/2)//到了倒数第二层即可,因为已经可以操作最后一层了
    {

    int leftChild=2*index+1;
    int rightChild=leftChild+1;
    if(rightChild<currentSize&&heapArray[leftChild]<heapArray[rightChild])
        largerChild=rightChild;//如果存在右孩子且右孩子比左孩子大
    else               //右孩子不存在或者右孩子比左孩子小
        largerChild=leftChild;//该index对应的左孩子一定存在,但是右孩子可能不存在
    if(top>=heapArray[largerChild])
        break;
    heapArray[index]=heapArray[largerChild];
    index=largerChild;
    }
    heapArray[index]=top;

}













#endif // PRACTICE_MAX_H_INCLUDED

practice.cpp文件

#include<iostream>
#include"practice Max.h"


using namespace std;

    int main()
    {

        MaxHeap<int> h(100);
//        h.Push(20);
//         h.Push(30);
//          h.Push(40); h.Push(50);
//          h.Push(90);
//          cout<<h.Top()<<endl;
//          h.Pop();
//          cout<<h.Top()<<endl;
//          h.Pop();
//         cout<<h.Top()<<endl;
//         cout<<h.IsEmpty()<<endl;




//堆排序

h.Push(50);

h.Push(15);

h.Push(30);

h.Push(70);

h.Push(6);

cout<<h.Top()<<endl;
h.Pop();
cout<<h.Top()<<endl;
h.Pop();
cout<<h.Top()<<endl;
h.Pop();
cout<<h.Top()<<endl;
h.Pop();
cout<<h.Top()<<endl;
h.Pop();



        return 0;
    }