Moved heap template class to header file

This commit is contained in:
2021-04-07 00:16:42 -05:00
parent f19fdac444
commit 8faf353425
2 changed files with 66 additions and 84 deletions

View File

@@ -1,78 +0,0 @@
#include "heap.hpp"
template<class T>
kernelns::Heap<T>::Heap()
{
}
template<class T>
kernelns::Heap<T>::Heap(T** array, size_t maxSize)
{
m_array = array;
m_size = 0;
m_limit = maxSize;
}
template<class T>
T* kernelns::Heap<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;
}
template<class T>
void kernelns::Heap<T>::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<class T>
void kernelns::Heap<T>::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<class T>
void kernelns::Heap<T>::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);
}
}

View File

@@ -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;