首页 > 代码库 > 二叉堆练习3

二叉堆练习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

 代碼實現:

 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