const int N=1e5+6;int pile[N],data[N];int idx=1,n;for(int i=1;i<=n;i++){ // 存入pile[idx]=data[i], idx++;}int ind=idx-1;while(2*ind>=idx) ind--; // 找到最后一个非叶子节点的下标void down_adjust(int pa){if(2*pa<idx &amp;&amp; 2*pa+1<idx){if(pile[2*pa]>pile[2*pa+1]){if(pile[2*pa]>pile[pa]){exchange(pa,2*pa);down_adjust(2*pa);}}else{if(pile[2*pa+1]>pile[pa]){exchange(pa,2*pa+1);down_adjust(2*pa+1);}}}if(2*pa<idx &amp;&amp; 2*pa+1>=idx){if(pile[2*pa]>pile[pa]){exchange(pa,2*pa);down_adjust(2*pa);}}}// 遍历调整for(int i=ind;i>=1;i--){int p=pile[i],l,r;if(2*i+1<idx) l=pile[2*i], r=pile[2*i+1];else l=pile[2*i], r=pile[i]-1;if(l>p &amp;&amp; l>r){exchange(i,2*i);down_adjust(2*i);}if(r>p &amp;&amp; r>l){exchange(i,2*i+1);down_adjust(2*i+1);}}