首页 > 代码库 > codevs 3110 二叉堆练习3
codevs 3110 二叉堆练习3
3110 二叉堆练习3
http://codevs.cn/problem/3110/
题目描述 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
详细讲解见随笔:讲解——堆 http://www.cnblogs.com/TheRoadToTheGold/p/6238795.html
此篇随笔只提供代码
#include<algorithm> #include<iostream> #include<cstdio> using namespace std; int n,a[500001]; int init() { int x=0;char c=getchar(); while(c<‘0‘||c>‘9‘) c=getchar(); while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x; } void heapify(int t) { int left=t*2,right=t*2+1; int minn=t;// if(left<=n) {minn=a[minn]<a[left] ? minn:left;} if(right<=n){minn=a[minn]<a[right] ? minn:right;} if(minn!=t) { swap(a[minn],a[t]); heapify(minn); } } void build() { for(int i=n/2;i;i--) heapify(i); } int get() { int top=a[1]; a[1]=a[n]; n--; heapify(1); return top; } int main() { n=init(); for(int i=1;i<=n;i++) a[i]=init(); build(); while(n) printf("%d ",get()); }
codevs 3110 二叉堆练习3
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。