From 48464840bae3492f527b63a09003e605f2aeee05 Mon Sep 17 00:00:00 2001 From: TUNQRT Date: Tue, 18 Feb 2025 20:30:19 +0100 Subject: [PATCH] heap build --- heap.cpp | 72 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/heap.cpp b/heap.cpp index e04574c..ad0526e 100644 --- a/heap.cpp +++ b/heap.cpp @@ -1,6 +1,5 @@ #include #include -#include #include @@ -10,40 +9,56 @@ public: void push(int); void print() const; bool empty() const; + + Heap(std::vector v); private: std::vector data; + void bubble_up(int index); + void bubble_down(int index); void dump(std::ofstream&, int) const; }; -void Heap::push(int h){ - data.push_back(h); - for(int i = data.size(); i > 1; i /= 2){ +Heap::Heap(std::vector v): data(std::move(v)){ + + for(int i = data.size()/2; i >= 0; i--){ + bubble_down(i); + } +} + +void Heap::bubble_up(int index){ + for(int i = index; i > 1; i /= 2){//neindexuje od 1, jen nulty prvek nema kam vysplhat if(data.at(i-1) < data.at(i/2-1)) std::swap(data[i-1], data[(i/2)-1]); else break; + } +} + +void Heap::bubble_down(int index){ + while(true){ + if(data.size() <= 2*index+1) break; + int small_child_i; + if(data.size() > 2*index+2 && data.at(2*index+2) < data.at(2*index+1)) + small_child_i = 2*index+2; + else small_child_i = 2*index+1; + + if(data.at(index) > data.at(small_child_i)){ + std::swap(data[index], data[small_child_i]); + index = small_child_i; + }else break; } } +void Heap::push(int h){ + data.push_back(h); + bubble_up(data.size()); +} + int Heap::pop(){ if (empty()) throw std::out_of_range("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); std::swap(data[0], data[data.size()-1]); int garbage = data.back(); data.pop_back(); - - int muj_index = 0; - while(true){ - if(data.size() <= 2*muj_index+1) break; - int small_child_i; - if(data.size() > 2*muj_index+2 && data.at(2*muj_index+2) < data.at(2*muj_index+1)) - small_child_i = 2*muj_index+2; - else small_child_i = 2*muj_index+1; - - if(data.at(muj_index) > data.at(small_child_i)){ - std::swap(data[muj_index], data[small_child_i]); - muj_index = small_child_i; - }else break; - } - + bubble_down(0); return garbage; } @@ -77,17 +92,16 @@ void Heap::print() const { int main() { - Heap h; - std::vector v = {1, 4, 9, 0, 7, 5, 8}; + Heap h({9, 7, 6, 5, 4, 3, 2, 1, 0, -3, 8}); - for (auto i : v) { - h.push(i); + // for (auto i : v) { + // h.push(i); h.print(); - } + // } - while (!h.empty()){ - int i = h.pop(); - h.print(); - } - int aaaaaaaaaaaaaaa = h.pop(); + // while (!h.empty()){ + // int i = h.pop(); + // h.print(); + // } + // int aaaaaaaaaaaaaaa = h.pop(); } \ No newline at end of file