Advertisement
MeShootIn

куча

Nov 5th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <limits.h>
  6. #include <assert.h>
  7. #include <set>
  8. #include <map>
  9. #include <math.h>
  10. #include <queue>
  11. #include <stack>
  12. #include <time.h>
  13. #include <stdlib.h>
  14. using namespace std;
  15. //typedef __int64 i64;
  16. typedef unsigned long long ull;
  17. const int MAXN = 100000;
  18. class max_heap{
  19.     private :
  20.         int * heap = new int[MAXN];
  21.         int size = 0;
  22.     public :
  23.         void sift_up(int v){
  24.             while(v > 0){
  25.                 int parent = (v - 1) / 2;
  26.                 if(heap[v] <= heap[parent]){
  27.                     return;
  28.                 }
  29.                 swap(heap[v], heap[parent]);
  30.                 v = parent;
  31.             }
  32.         }
  33.         void sift_down(int v){
  34.             int index_max = v;
  35.             int left = 2 * v + 1;
  36.             int right = 2 * v + 2;
  37.             if(left < size && heap[left] > heap[index_max]){
  38.                 index_max = left;
  39.             }
  40.             if(right < size && heap[right] > heap[index_max]){
  41.                 index_max = right;
  42.             }
  43.             if(index_max != v){
  44.                 swap(heap[index_max], heap[v]);
  45.                 sift_down(index_max);
  46.             }
  47.         }
  48.         int extract_max(){
  49.             int heap_max = heap[0];
  50.             heap[0] = heap[size - 1];
  51.             size--;
  52.             sift_down(0);
  53.             return heap_max;
  54.         }
  55.         void ins(int x){
  56.             heap[size] = x;
  57.             sift_up(size);
  58.             size++;
  59.         }
  60.         void print_sorted(){
  61.             int n = size;
  62.             int * ans = new int[n];
  63.             for(int i = 0; i < n; i++){
  64.                 ans[i] = extract_max();
  65.             }
  66.             reverse(ans, ans + n);
  67.             for(int i = 0; i < n; i++){
  68.                 printf("%d ", ans[i]);
  69.             }
  70.         }
  71.         void print_heap(){
  72.             for(int i = 0; i < size; i++){
  73.                 printf("%d ", heap[i]);
  74.             }
  75.         }
  76. };
  77. int main(){
  78.     int n;
  79.     scanf("%d", &n);
  80.     max_heap H;
  81.     int x;
  82.     for(int i = 0; i < n; i++){
  83.         scanf("%d", &x);
  84.         H.ins(x);
  85.     }
  86.     H.print_sorted();
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement