|
| 1 | +template <typename T, typename Cmp> |
| 2 | +my::Heap<T, Cmp>::Heap(std::vector<T> &input, const Cmp &cmp) |
| 3 | + : m_heap(input), |
| 4 | + m_size(input.size()), |
| 5 | + m_cmp(cmp) |
| 6 | +{ |
| 7 | + make_heap(); |
| 8 | +} |
| 9 | + |
| 10 | +template <typename T, typename Cmp> |
| 11 | +template <typename RandomAccessIterator> |
| 12 | +my::Heap<T, Cmp>::Heap(RandomAccessIterator first, RandomAccessIterator last) |
| 13 | + : m_heap(first, last), |
| 14 | + m_size(last - first), |
| 15 | + m_cmp() |
| 16 | +{ |
| 17 | + make_heap(); |
| 18 | +} |
| 19 | + |
| 20 | +template <typename T, typename Cmp> |
| 21 | +void my::Heap<T, Cmp>::make_heap() |
| 22 | +{ |
| 23 | + for (int i = (m_size / 2) - 1; i >= 0; --i) |
| 24 | + { |
| 25 | + heapify_down(i); |
| 26 | + } |
| 27 | +} |
| 28 | + |
| 29 | +template <typename T, typename Cmp> |
| 30 | +size_t Heap<T, Cmp>::parent(size_t ind) |
| 31 | +{ |
| 32 | + return (ind - 1) / 2; |
| 33 | +} |
| 34 | + |
| 35 | +template <typename T, typename Cmp> |
| 36 | +size_t my::Heap<T, Cmp>::left(size_t ind) |
| 37 | +{ |
| 38 | + return 2 * ind + 1; |
| 39 | +} |
| 40 | + |
| 41 | +template <typename T, typename Cmp> |
| 42 | +size_t my::Heap<T, Cmp>::right(size_t ind) |
| 43 | +{ |
| 44 | + return 2 * ind + 2; |
| 45 | +} |
| 46 | + |
| 47 | +template <typename T, typename Cmp> |
| 48 | +void my::Heap<T, Cmp>::heapify_down(size_t ind) |
| 49 | +{ |
| 50 | + size_t largest = ind; |
| 51 | + size_t l = left(ind); |
| 52 | + size_t r = right(ind); |
| 53 | + |
| 54 | + if (l < m_size && m_cmp(m_heap[l], m_heap[largest])) |
| 55 | + largest = l; |
| 56 | + |
| 57 | + if (r < m_size && m_cmp(m_heap[r], m_heap[largest])) |
| 58 | + largest = r; |
| 59 | + |
| 60 | + if (largest != ind) |
| 61 | + { |
| 62 | + std::swap(m_heap[ind], m_heap[largest]); |
| 63 | + heapify_down(largest); |
| 64 | + } |
| 65 | +} |
| 66 | + |
| 67 | +template <typename T, typename Cmp> |
| 68 | +void my::Heap<T, Cmp>::print() |
| 69 | +{ |
| 70 | + for (int i = 0; i < m_size; ++i) |
| 71 | + { |
| 72 | + std::cout << m_heap[i] << " "; |
| 73 | + } |
| 74 | + std::cout << std::endl; |
| 75 | +} |
0 commit comments