#include<iostream>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
const int MAX=50;
using namespace std;
int h[MAX];
int N=10;//长度
void sifup(int i)
{
if(i==1)
{
return;
}
while(i/2!=0)
{
if(h[i]<h[i/2])//小于父节点 //上浮
{
swap(h[i],h[i/2]);
}
else //等于父节点 或是 大于父节点 不需要操作
{
return;
//break;
}
i/=2;
}
}
void sifdown(int i)//向下调整
{
if(i*2>=N)//大于长度 已到叶子结点 不用调整
{
return;
}
if(h[i]<h[i/2])//小于父节点 向上调整
{
sifup(i);
return;
}
if(h[i]<h[i*2] && h[i]<h[i*2+1])//父节点小于左右结点
{
return; //不用调整
}
//+++++++++++++++++++++++++++++++此时父节点一定大于左右结点
int r,l,k;//左右两个结点的下标
l=i*2; r=i*2+1;
k=h[l]>h[r]?r:l;//选出最小的结点的下标
//cout<<k<<endl;
swap(h[k],h[i]);
sifdown(k);
}
int main()
{
for(int i=1;i<=10;i++)
{
h[i]=rand()%20;
sifup(i);
}
for(int i=1;i<=10;i++)
{
cout<<h[i]<<" ";
}cout<<endl;
h[1]=100;
sifdown(1);
for(int i=1;i<=N;i++)
{
cout<<h[i]<<" ";
}cout<<endl;
return 0;
}