#include <iostream>
#include <string>
#include <set>
#include <vector>
using namespace std;
template<typename T>
void show(T &arry){
for(auto &k : arry){
std::cout<<" "<<k;
}
std::cout<<std::endl;
}
template<typename T>
void MinHeapify(T &arry, int size, int element)
{
int lchild=element*2+1;
int rchild=lchild+1;
while(rchild<size)
{
if(arry[element] <= arry[lchild] && arry[element] <= arry[rchild])
{
cout<<"end";
return;
}
if(arry[lchild]<=arry[rchild])
{
cout<<" | 双子树 l[index("<<lchild<<" , "<<element<<") value("<<arry[lchild]<<" , "<<arry[element]<<")]";
swap(arry[element],arry[lchild]);
element=lchild;
}
else
{
cout<<" | 双子树 r[index("<<rchild<<" , "<<element<<") value("<<arry[rchild]<<" , "<<arry[element]<<")]";
swap(arry[element],arry[rchild]);
element=rchild;
}
lchild = element*2+1;
rchild = lchild+1;
}
if(lchild<size && arry[lchild]<arry[element])
{
cout<<" | 单子树 l[index("<<lchild<<" , "<<element<<") value("<<arry[lchild]<<" , "<<arry[element]<<")]";
swap(arry[lchild], arry[element]);
}else{
cout<<" | 无动作";
}
return;
}
template<typename T>
void HeapSort(T &arry,int size)
{
int i;
cout<<"构造堆(小顶堆,下标小的值也小)"<<endl;
for(i=size/2-1; i>=0; --i)
{
std::cout<<i<<" - ";
MinHeapify(arry,size,i);
show<T>(arry);
}
cout<<endl<<"调整堆";
while(size>0)
{
cout<<endl<<"取最值 "<<arry[0]<<endl;
swap(arry[size-1],arry[0]);
size--;
MinHeapify(arry,size,0);
}
return;
}
int main(int argc, char **argv)
{
std::vector<int> arry={11,53,64,76,23,32,43,85};
HeapSort<std::vector<int>>(arry, arry.size());
show<std::vector<int>>(arry);
return 0;
}