#ifndef __IRR_HEAPSORT_H_INCLUDED__
#define __IRR_HEAPSORT_H_INCLUDED__
#include "irrTypes.h"
namespace irr
{
namespace core
{
template<class T>
inline void heapsink(T*array, s32 element, s32 max)
{
while ((element<<1) < max)
{
s32 j = (element<<1);
if (j+1 < max && array[j] < array[j+1])
j = j+1;
if (array[element] < array[j])
{
T t = array[j];
array[j] = array[element];
array[element] = t;
element = j;
}
else
return;
}
}
template<class T>
inline void heapsort(T* array_, s32 size)
{
T* virtualArray = array_ - 1;
s32 virtualSize = size + 2;
s32 i;
for (i=((size-1)/2); i>=0; --i)
heapsink(virtualArray, i+1, virtualSize-1);
for (i=size-1; i>0; --i)
{
T t = array_[0];
array_[0] = array_[i];
array_[i] = t;
heapsink(virtualArray, 1, i + 1);
}
}
}
}
#endif