#include<iostream>
#include <vector>
using namespace std;
template<typename T>
void HeapAdjust(vector<T> &a,int i, int len){
if(i>len/2) return ;
int l=i*2; //这里i是从1开始的
int r=i*2+1;
int maxi=i;
if(l<=len && a[maxi]<a[l]){//保存l,r是不大于长度的
maxi=l;
}
if(r<=len && a[maxi]<a[r]){
maxi=r;
}
if(maxi!=i){//如果没有变化则不需要变换和子结点调整
swap(a[i],a[maxi]);
HeapAdjust(a,maxi,len);//变化后可能不符堆的性质,从交换子结点那开始再调整
}
}
template<typename T>
void BuildHeap(vector<T> &a,int len){
for(int i=len/2;i>=1;--i){
HeapAdjust(a,i,len);
}
}
template<typename T>
void HeapSort(vector<T> &a, int len){
BuildHeap(a,len);//建堆
for(int i=len;i>=1;--i){
swap(a[1],a[i]);
HeapAdjust(a,1,i-1);//注意这里的参数,以最顶元素来调整,且数组长度-1
}
}
int main()
{
vector<int> a{0,2,4,1,9,6,5,100,11};
int len=a.size()-1;
HeapSort(a,len);
for(int i=1;i<=len;i++){
cout<<a[i]<<" ";
}
}
09-12