思想:
1.构建最大堆
2.把根节点和最后一个节点交换,,把堆长度-1,也就不考虑放最后的最大的元素了,再构建最大堆
3.现在第二大的元素在根节点了,我们再重复步骤2,直到堆长度为1
void MaxHeap(int a[],int fa,int n){
int i,s=a[fa];
for(i=fa<<1;i<=n;i<<=1){
if(i<n&&a[i]<a[i+1])i++;
if(s>a[i])break;
a[i>>1]=a[i];
}
a[i>>1]=s;
}
void BuildHeap(int a[],int n){
for(int i=n>>1;i>=1;i--)
MaxHeap(a,i,n);
}
void HeapSort(int a[],int n){
BuildHeap(a,n);
for(int i=n;i>=2;i--){
int t=a[i];
a[i]=a[1];
a[1]=t;
MaxHeap(a,1,i-1);
}
}
调用:
for(int i=1; i<=n; i++) //注意是从1开始
cin>>a[i];
HeapSort(a,n);
for(int i=1; i<=n; i++)cout<<a[i]<<" ";