3110 二叉堆练习3
时间限制: 3 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
查看运行结果
题目描述 Description
给定N(N≤500,000)和N个整数(较有序),将其排序后输出。
输入描述 Input Description
N和N个整数
输出描述 Output Description
N个整数(升序)
样例输入 Sample Input
5
12 11 10 8 9
样例输出 Sample Output
8 9 10 11 12
数据范围及提示 Data Size & Hint
对于33%的数据 N≤10000
对于另外33%的数据 N≤100,000 0≤每个数≤1000
对于100%的数据 N≤500,000 0≤每个数≤2*10^9
写在前面:哭晕(:з」∠)
————————————————————————————————————————————————————————
写在前面:不想说啥了,一个星期没碰电脑,手都生了,想不起程序段回去看原来写的,后来写了半天发现并不适用,尽情地叫我脑残好了!(这道题是可以用快排做的←—←)
#include<cstdio>
#include<iostream>
using namespace std;
int heap[500001],n,len,x;
void fix()
{
int l=len;
while (l/2>=0)
{
int k=l/2;
if (heap[l]>=heap[k]) break;
else
{
swap(heap[l],heap[k]);
l=k;
}
}
}
void get()
{
int l=1;
while (l*2<=len)
{
int k=l*2;
if (heap[k]>heap[k+1]&&k+1<=len) k++;
if (heap[l]<=heap[k]) break;
else
{
swap(heap[l],heap[k]);
l=k;
}
}
}
main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
len++;
heap[len]=x;
fix();
}
for (int i=1;i<=n;i++)
{
get();
printf("%d ",heap[1]);
heap[1]=heap[len];
len--;
}
}