#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
int tree[1000];
int n;
void siftdown(int i)//建立最小堆
{
int t , flag = 0;
while(2*i <= n && flag == 0)
{
if(tree[i] > tree[i*2])//<,建立最大堆
t = 2 *i;
else
t = i;
if(i*2+1 <= n)
{
if(tree[t] > tree[i*2+1])//<建立最大堆
t = i*2+1;
}
if(t != i)
{
swap(tree[t],tree[i]);
i = t;
}
else
flag = 1;
}
}
void siftup(int i)//插入
{
int flag = 0;
if(i == 1)
return ;
while(i != 1 && flag == 0)
{
if(tree[i] < tree[i/2])
swap(tree[i],tree[i/2]);
else
flag =1 ;
i /= 2;
}
}
void delate()//在堆中只删除根节点,将堆种的最后的元素,移到根节点处,然后向下更新至n-1的位置。
{
tree[1] = tree[n];
n --;
for(int i = n/2 ; i >= 1 ; i --)
siftdown(i);
}
int deletmax()//利用这个需要建立最小堆
{
int t;
t = tree[1];
tree[1] = tree[n];
n --;
siftdown(1);
return t;
}
void heapsort()//需要建立最大堆(修改siftdown代码)
{
while(n > 1)
{
swap(tree[1],tree[n]);
n --;
siftdown(1);
}
}
int main(void)
{
cin>>n;
for(int i = 1 ; i <= n ; i ++)
cin>>tree[i];
//建堆1
for(int i = n/2 ; i >= 1 ; i --)
siftdown(i);
//堆排序1(最小堆)
cout<<"最小堆: ";
for(int i = 1 ; i <= n ; i ++)
cout<<tree[i]<<" ";
cout<<endl;
delate();//删除顶部元素
cout<<"删除后的堆: ";
for(int i = 1 ; i <= n ; i ++)
cout<<tree[i]<<" ";
cout<<endl;
cout<<"需要插入的个数: ";
int m;//输入需要插入的数字
cin>>m;
for(int i = 1 ; i <= m ; i ++)
{
n ++;
int temp;
cout<<"输入需要插入的数字: ";
cin>>temp;
tree[n] = temp;
siftup(n);
cout<<"插入后的堆: ";
for(int i = 1 ; i <= n ; i ++)
cout<<tree[i]<<" ";
cout<<endl;
}
int num = n;
cout<<"堆排序后:";
for(int i = 1 ; i <= num ; i ++)
cout<<deletmax()<<" ";
cout<<endl;
//堆排序2(需要建立最大堆)
/*heapsort();
for(int i = 1 ; i <= num ; i ++)
cout<<tree[i]<<" ";*/
}
/*
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
*/