Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cassert>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. class heap
  8. {
  9. private:
  10.         vector < int > *arr;
  11.         inline void up_el(int el);
  12.         inline void down_el(int el);
  13.         inline int next_for_down(int el);
  14. public:
  15.         int size() { return arr->size(); }
  16.         heap() : arr(new vector < int >()) {}
  17.         heap(vector < int > *arr) : arr(arr)
  18.         {
  19.                 for (int i = arr->size() - 1; i >= 0; down_el(i--));
  20.         }
  21.         inline void add(int new_el);
  22.         int min_el() { assert(size()); return (*arr)[0]; }
  23.         inline int del_min();
  24.         inline heap(const heap& h) { *arr = *(h.arr); }
  25.         inline void operator= (const heap& h) { *arr = *(h.arr); }
  26. };
  27.  
  28. inline void heap::up_el(int el)
  29. {
  30.         for (; el && (*arr)[el] < (*arr)[(el - 1) >> 1]; el = (el - 1) >> 1)
  31.                 swap((*arr)[el], (*arr)[(el - 1) >> 1]);
  32. }
  33.  
  34. inline int heap::next_for_down(int el)
  35. {
  36.         int to = el;
  37.         if ((el << 1) + 1 < size() && (*arr)[el] > (*arr)[(el << 1) + 1])
  38.                 to = (el << 1) + 1;
  39.         if ((el << 1) + 2 < size() && (*arr)[(el << 1) + 1] > (*arr)[(el << 1) + 2])
  40.                 to = (el << 1) + 2;
  41.         return to;
  42. }
  43.  
  44. inline void heap::down_el(int el)
  45. {
  46.         for (int to; (to = next_for_down(el)) != el; el = to)
  47.         {
  48.                 swap((*arr)[el], (*arr)[to]);
  49.         }
  50. }
  51.  
  52. inline void heap::add(int new_el)
  53. {
  54.         (*arr).push_back(new_el);
  55.         up_el(size() - 1);
  56. }
  57.  
  58. inline int heap::del_min()
  59. {
  60.         int res = min_el();
  61.         swap((*arr)[0], (*arr)[size() - 1]);
  62.         arr->pop_back();
  63.         down_el(0);
  64.         return res;
  65. }
  66.  
  67. inline bool is_sorted(const vector < int > &arr)
  68. {
  69.         int size = arr.size();
  70.         if (size < 2) return true;
  71.         for (int i = 1; i < size; ++i)
  72.                 if (arr[i] < arr[i - 1])
  73.                         return false;
  74.         return true;
  75. }
  76.  
  77. vector < int > arr;
  78.  
  79. heap mheap;
  80.  
  81. int main()
  82. {
  83.         for (int i = 0; i < 10; ++i)
  84.                 arr.push_back(i);
  85.         random_shuffle(arr.begin(), arr.end());
  86.         mheap = heap(&arr);
  87.         for (int i = 0, sz = mheap.size(); i < sz; ++i)
  88.         {
  89.                 cout << mheap.del_min() << endl;
  90.         }
  91.         system("pause");
  92.         return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement