#include <bits/stdc++.h>
using namespace std;
//[4,3,5,2,1]
void tiao(vector<int>& v, int node, int leng){int left,right;int Min;while(1){left=node*2+1; //左节点right=node*2+2; //右节点if(left<leng){ //如果有左节点Min=min(v[node],v[left]); //父节点和左节点取最小值if(right<leng){ //如果有右节点Min=min(Min,v[right]); //三个节点取最小值if(Min==v[right]){ //如果最小值是右节点swap(v[node],v[right]); //交换父节点和右节点node=right; //接下来判断右节点是否符合最小堆}}if(Min==v[left]){ //如果最小值是左节点swap(v[node],v[left]); //交换父节点和左节点node=left; //接下来判断左节点是否符合最小堆}else if(Min==v[node]) //如果最小值是父节点,结束break;}else{ //如果没有左节点break;}}
}vector<int> create(vector<int>& v){int leng=v.size(); int last_node=leng/2-1; //最后一个非叶子节点for(int n=last_node;n>=0;--n){tiao(v,n,leng); //从右往左,从下往上调整}return v;
}using namespace std;
int main() {//int a;//cin >> a;vector<int> v={3,2,5,1,7,4};vector<int> ans=create(v);for(int i:ans){cout<<i<<" ";}
}