akela43

buildHeap

May 24th, 2020
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include <vector>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <functional>
  5. #include <iterator>
  6.  
  7. template <typename T>
  8. class Heap
  9. {
  10. public:
  11.     Heap() {}
  12.     Heap(std::vector <T> & other, bool minHeap): v(other), typeHeap(minHeap), size(v.size()) {}
  13.     void buildHeap() {
  14.         for (int i = v.size() /2; i >=0; --i)
  15.             siftDown(i);
  16.     }
  17.     void siftDown(int i) {
  18.         int maxIdx = maxIndex(i);
  19.         while ((maxIdx = maxIndex(i)) != i ) {
  20.             swap(i, maxIdx);
  21.             i = maxIdx;
  22.         }
  23.     }
  24.     void swap(size_t i, size_t j) {
  25.         vlog.push_back({i, j});
  26.         std::swap(v[i], v[j]);
  27.     }
  28.     inline int maxIndex(int i) {
  29.         int child;
  30.         int m = (child  = 2 * i + 1) >= size ? i : f(v[i], v[child])  ? i : child;
  31.         m = (child  = 2 * i + 2) >= size ? m : f(v[m], v[child])  ? m : child;
  32.         return m;
  33.     }
  34.  
  35. std::vector <T> & v;
  36. std::vector <std::pair<size_t, size_t>> vlog;
  37. bool typeHeap;
  38. int size;
  39.  
  40. bool f(T &l, T & r) {
  41.     return  typeHeap ? l <= r : r <= l;
  42. }
  43.  
  44. };
  45.  
  46. using namespace std;
  47.  
  48. int main()
  49. {
  50.     size_t n;
  51.     std::cin >> n;
  52.     std::vector <double> v(n) ;
  53.     std::copy_n(std::istream_iterator<double>(std::cin), n, v.begin());
  54.  
  55.     Heap <double>heap {v, true};
  56.     heap.buildHeap();
  57.  
  58.     std::cout << heap.vlog.size() << "\n";
  59.     for (const auto & x: heap.vlog) {
  60.         std::cout << x.first << " " << x.second << "\n";
  61.     }
  62.  
  63.     return 0;
  64. }
Add Comment
Please, Sign In to add comment