From 8faf353425646f7fe3e6927788f1a4fb0251bd6b Mon Sep 17 00:00:00 2001 From: Nathan Giddings Date: Wed, 7 Apr 2021 00:16:42 -0500 Subject: [PATCH] Moved heap template class to header file --- src/heap.cpp | 78 ---------------------------------------------------- src/heap.hpp | 72 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 84 deletions(-) delete mode 100644 src/heap.cpp diff --git a/src/heap.cpp b/src/heap.cpp deleted file mode 100644 index 6ad056c..0000000 --- a/src/heap.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "heap.hpp" - -template -kernelns::Heap::Heap() -{ - -} - -template -kernelns::Heap::Heap(T** array, size_t maxSize) -{ - m_array = array; - m_size = 0; - m_limit = maxSize; -} - -template -T* kernelns::Heap::extractMin() -{ - if(m_size == 0) - return nullptr; - m_size--; - T* p = m_array[0]; - m_array[0] = m_array[m_size]; - heapify(0); - return p; -} - -template -void kernelns::Heap::insert(T* n) -{ - if(m_size == m_limit) // TODO: have insert return status code - return; - size_t i = m_size; - m_size++; - while(i > 0 && *m_array[(i - 1) / 2] > *n) - { - m_array[i] = m_array[(i - 1) / 2]; - i = (i - 1) / 2; - } - m_array[i] = n; -} - -template -void kernelns::Heap::remove(T* n) -{ - for(size_t i = 0; i < m_size; i++) - { - if(m_array[i] == n) - { - m_size--; - m_array[i] = m_array[m_size]; - heapify(i); - break; - } - } -} - -template -void kernelns::Heap::heapify(size_t i) -{ - if(i * 2 + 1 >= m_size) - return; - if (*m_array[i * 2 + 1] <= *m_array[i] && *m_array[i * 2 + 1] <= *m_array[i * 2 + 2]) - { - T buffer = m_array[i]; - m_array[i] = m_array[i * 2 + 1]; - m_array[i * 2 + 1] = buffer; - heapify(i * 2 + 1); - } - else if (*m_array[i * 2 + 2] <= *m_array[i] && *m_array[i * 2 + 2] <= *m_array[i * 2 + 1]) - { - T buffer = m_array[i]; - m_array[i] = m_array[i * 2 + 2]; - m_array[i * 2 + 2] = buffer; - heapify(i * 2 + 2); - } -} \ No newline at end of file diff --git a/src/heap.hpp b/src/heap.hpp index 93af712..cf6b456 100644 --- a/src/heap.hpp +++ b/src/heap.hpp @@ -13,19 +13,79 @@ class Heap { public: - Heap(); + Heap() + { - Heap(T** array, size_t maxSize); + } - T* extractMin(); + Heap(T** array, size_t maxSize) + { + m_array = array; + m_size = 0; + m_limit = maxSize; + } - void insert(T* n); + T* extractMin() + { + if(m_size == 0) + return nullptr; + m_size--; + T* p = m_array[0]; + m_array[0] = m_array[m_size]; + heapify(0); + return p; + } - void remove(T* n); + Status insert(T* n) + { + if(m_size == m_limit) + return Status::NoMemory; + size_t i = m_size; + m_size++; + while(i > 0 && *m_array[(i - 1) / 2] > *n) + { + m_array[i] = m_array[(i - 1) / 2]; + i = (i - 1) / 2; + } + m_array[i] = n; + return Status::OK; + } + + void remove(T* n) + { + for(size_t i = 0; i < m_size; i++) + { + if(m_array[i] == n) + { + m_size--; + m_array[i] = m_array[m_size]; + heapify(i); + break; + } + } + } private: - void heapify(size_t index); + void heapify(size_t index) + { + if(i * 2 + 1 >= m_size) + return; + if (*m_array[i * 2 + 1] <= *m_array[i] && *m_array[i * 2 + 1] <= *m_array[i * 2 + 2]) + { + T buffer = m_array[i]; + m_array[i] = m_array[i * 2 + 1]; + m_array[i * 2 + 1] = buffer; + heapify(i * 2 + 1); + } + else if (*m_array[i * 2 + 2] <= *m_array[i] && *m_array[i * 2 + 2] <= *m_array[i * 2 + 1]) + { + T buffer = m_array[i]; + m_array[i] = m_array[i * 2 + 2]; + m_array[i * 2 + 2] = buffer; + heapify(i * 2 + 2); + } + } T** m_array;