#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
using namespace std;
template <class T>
class MinHeap{
private:
T *HeapArray;
int current_size;
int max_size;
public:
MinHeap(int n);
~MinHeap();
void InitHeap();
void SiftDown(int pos);
void SiftUp(int pos);
void BuildHeap();
bool Insert(T data);
bool MoveMin();
void display();
};
template <class T>
MinHeap <T>::MinHeap(int n){
HeapArray = new T[n];
max_size = n;
current_size = 0;
}
template <class T>
MinHeap <T>::~MinHeap(){
delete []HeapArray;
}
template <class T>
void MinHeap <T>::InitHeap(){
int init_len;
T temp;
cout<<"Input the init_num :";
cin>>init_len;
current_size=init_len;
for(int i=0;i<init_len;i++){
cin>>HeapArray[i];
}
}
template <class T>
void MinHeap <T>::SiftDown(int pos){
while(pos<current_size){
if(2*pos+2<current_size){
T temp=min(HeapArray[pos],min(HeapArray[pos*2+1],HeapArray[pos*2+2]));
if(temp==HeapArray[pos]) break;
else if(temp==HeapArray[pos*2+1]){
HeapArray[pos*2+1]=HeapArray[pos];
HeapArray[pos]=temp;
pos=pos*2+1;
continue;
}
else{
HeapArray[pos*2+2]=HeapArray[pos];
HeapArray[pos]=temp;
pos=pos*2+2;
continue;
}
}
else{
if(HeapArray[pos]>HeapArray[pos*2+1]){
T temp=HeapArray[pos];
HeapArray[pos]=HeapArray[pos*2+1];
HeapArray[pos*2+1]=temp;
break;
}
else break;
}
}
}
template <class T>
void MinHeap <T>::SiftUp(int pos){
while(pos>=0){
if(HeapArray[pos]<HeapArray[(pos-1)/2]){
T temp=HeapArray[pos];
HeapArray[pos]=HeapArray[(pos-1)/2];
HeapArray[(pos-1)/2]=temp;
pos=(pos-1)/2;
}
else break;
}
}
template <class T>
void MinHeap <T>::BuildHeap(){
InitHeap();
for(int i=(current_size-1)/2;i>=0;i--){
SiftDown(i);
}
}
template <class T>
bool MinHeap <T>::Insert(T data){
if(current_size<max_size){
HeapArray[current_size]=data;
SiftUp(current_size-1);
current_size++;
return true;
}
else return false;
}
template <class T>
bool MinHeap <T>::MoveMin(){
if(current_size==0) return false;
else{
HeapArray[0]=HeapArray[current_size-1];
current_size--;
SiftDown(0);
}
}
template <class T>
void MinHeap <T>::display(){
for(int i=0;i<current_size;i++)
cout<<HeapArray[i]<<" ";
cout<<endl;
}
int main(){
int len;
cout<<"Input the max_size :";
cin>>len;
MinHeap <string> opt(len);
string temp;
opt.display();
opt.BuildHeap();
opt.display();
cout<<"Input the data you want to insret :";
cin>>temp;
opt.Insert(temp);
opt.display();
cout<<"Delete the Minist data :";
opt.MoveMin();
opt.display();
system("pause");
return 0;
}