首先明确堆是一个完全二叉树,小顶堆指根结点的值小于或等于左右子节点的值,大顶堆指根结点的值都大于或等于左右子节点的值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
const int maxn=1e3+5;
int arr[maxn];
int n ;
void maxHeap(int *a,int i )
{
int left,right,largest;
left=largest = 2*i;
if(left>n)
return ;
right=2*i+1;
if(right<=n&&a[right]>a[left])
largest = right;
if(a[i]<a[largest])
{
int temp ;
temp = a[i];
a[i]=a[largest];
a[largest]= temp;
maxHeap(a, largest);
}
}
void minHeap(int *a,int i )
{
int left,right,largest;
left=largest = 2*i;
if(left>n)
return ;
right=2*i+1;
if(right<=n&&a[right]<a[left])
largest = right;
if(a[i]>a[largest])
{
int temp ;
temp = a[i];
a[i]=a[largest];
a[largest]= temp;
minHeap(a, largest);
}
}
int main(){
int m ;
cin>>n>>m;
for(int i =1;i<=n;i++)
{
cin>>arr[i];
}
for(int i=n/2;i>=1;i--)
minHeap(arr,i);
for(int i = 1 ;i<=n;i++)
{
cout<<arr[i]<<" ";
}
}