C++實現大頂堆(插入,刪除)


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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM