二叉堆练习3
Posted 鄉勇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉堆练习3相关的知识,希望对你有一定的参考价值。
题目描述 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
代碼實現:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n,a,b,c,dp,ado,rec; 5 int heap[600000];//數組要開的大一些。 6 void put(int x){ 7 ++dp; 8 heap[dp]=x; 9 rec=dp; 10 while(rec>1){ 11 if(heap[rec]<heap[rec/2]){ 12 swap(heap[rec],heap[rec/2]); 13 rec/=2; 14 } 15 else break; 16 } 17 } 18 int get(){ 19 int d=1,e; 20 rec=heap[d]; 21 heap[d]=heap[dp]; 22 dp--; 23 while(d*2<=dp){ 24 if(heap[d*2]>heap[d*2+1]) c=d*2+1; 25 else c=d*2; 26 if(heap[d]>heap[c]){ 27 swap(heap[d],heap[c]); 28 d=c; 29 } 30 else break; 31 } 32 return rec; 33 } 34 int main(){ 35 cin>>n; 36 for(int i=1;i<=n;i++){ 37 cin>>a; 38 put(a); 39 } 40 for(int i=1;i<=n;i++) printf("%d ",get()); 41 return 0; 42 }
一個堆排的裸題。
以上是关于二叉堆练习3的主要内容,如果未能解决你的问题,请参考以下文章