立即学习:https://edu.csdn.net/course/play/24449/308966?utm_source=blogtoedu
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
int a[110];
using namespace std;
void kkk(int a[],int low,int high)
{
//low:堆的根结点位置
//high:堆的最后一个元素的位置
int x=low;//x开始指向根节点
int y=2*x+1;//y开始是左孩子
int tmp=a[low];//把堆顶存起来
while(y<=high)//只要y位置有值
{
if(a[y+1]>a[y]&&y+1<=high)//如果右孩子比左边大且有值
{
y=y+1;//y指向右孩子
}
if(a[y]>tmp)
{
a[x]=a[y];
x=y;//往下看一层
y=2*x+1;
}
else//tmp更大,把tmp放到x的位置
{
a[x]=tmp;
break;
}
}
a[x]=tmp; //把tmp放到叶子节点上
}
void dui_pai_xu(int a[])
{
int n=3;
for(int i=(n-1)/2;i>=0;i--)//i表示建堆的时候调整的部分的下标
{
kkk(a,i,n-1);
}
for(int i=n-1;i>0;i--)//i指向当前堆最后一个元素
{
swap(a[0],a[i]);
kkk(a,0,i-1);
}
}
int main()
{
for(int i=0;i<3;i++) cin>>a[i];
dui_pai_xu(a);
for(int i=0;i<3;i++) cout<<a[i]<<" ";
return 0;
}