所谓“堆的建立”,是指将已经存在的N个元素调整成最大堆或最小堆。
输入格式:
第一行是一个整数N,表示元素的个数,N<=10000。第二行N个元素的值。
输出格式:
输出2行,第一行是输入序列调整为最大堆后的元素序列,元素之间用空格分开。第二行是输入序列调整为最小堆后的元素序列,元素之间用空格分开。
输入样例:
在这里给出一组输入。例如:
8
7 5 8 4 2 3 6 1
输出样例:
在这里给出相应的输出。例如:
8 5 7 4 2 3 6 1
1 2 3 4 7 8 6 5
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
const int N = 100010;
int a[N],b[N];
int n,r;
void big_down(int u){
int t = u;
if(u*2 <= r&&a[u] < a[2*u])t = 2*u;
if(u*2 + 1 <= r&&a[t] < a[2*u+1])t = 2*u + 1;
if(u!=t){
swap(a[u],a[t]);
big_down(t);
}
}
void small_down(int u){
int t = u;
if(u*2 <= r&&b[u] > b[2*u])t = 2*u;
if(u*2 + 1 <= r&&b[t] > b[2*u+1])t = 2*u + 1;
if(u!=t){
swap(b[u],b[t]);
small_down(t);
}
}
int main (){
scanf("%d",&n);
r=n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
for(int i = n/2;i>=1;i--)big_down(i);
for(int i=1;i<n;i++)cout<<a[i]<<' ';
cout<<a[n]<<endl;
for(int i = n/2;i>=1;i--)small_down(i);
for(int i=1;i<n;i++)cout<<b[i]<<' ';
cout<<b[n];
}