Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <vector>
- #include <iostream>
- #include <algorithm>
- #include <limits.h>
- #include <assert.h>
- #include <set>
- #include <map>
- #include <math.h>
- #include <queue>
- #include <stack>
- #include <time.h>
- #include <stdlib.h>
- using namespace std;
- //typedef __int64 i64;
- typedef unsigned long long ull;
- const int MAXN = 100000;
- class max_heap{
- private :
- int * heap = new int[MAXN];
- int size = 0;
- public :
- void sift_up(int v){
- while(v > 0){
- int parent = (v - 1) / 2;
- if(heap[v] <= heap[parent]){
- return;
- }
- swap(heap[v], heap[parent]);
- v = parent;
- }
- }
- void sift_down(int v){
- int index_max = v;
- int left = 2 * v + 1;
- int right = 2 * v + 2;
- if(left < size && heap[left] > heap[index_max]){
- index_max = left;
- }
- if(right < size && heap[right] > heap[index_max]){
- index_max = right;
- }
- if(index_max != v){
- swap(heap[index_max], heap[v]);
- sift_down(index_max);
- }
- }
- int extract_max(){
- int heap_max = heap[0];
- heap[0] = heap[size - 1];
- size--;
- sift_down(0);
- return heap_max;
- }
- void ins(int x){
- heap[size] = x;
- sift_up(size);
- size++;
- }
- void print_sorted(){
- int n = size;
- int * ans = new int[n];
- for(int i = 0; i < n; i++){
- ans[i] = extract_max();
- }
- reverse(ans, ans + n);
- for(int i = 0; i < n; i++){
- printf("%d ", ans[i]);
- }
- }
- void print_heap(){
- for(int i = 0; i < size; i++){
- printf("%d ", heap[i]);
- }
- }
- };
- int main(){
- int n;
- scanf("%d", &n);
- max_heap H;
- int x;
- for(int i = 0; i < n; i++){
- scanf("%d", &x);
- H.ins(x);
- }
- H.print_sorted();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement