diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/include/heapsort.h Irrlicht_starsonata/include/heapsort.h --- irrlicht-svn-ss/trunk/include/heapsort.h 2007-07-26 02:11:22.000000000 +0200 +++ Irrlicht_starsonata/include/heapsort.h 2008-06-07 13:56:26.000000000 +0200 @@ -12,6 +12,72 @@ namespace irr namespace core { +//! Function object which can be used for sorting +template +bool Less(const T& a, const T& b) +{ + return a < b; +} + +//! Function object which can be used for sorting +template +bool Greater(const T& a, const T& b) +{ + return a > b; +} + +//! Sinks an element into the heap with a custom compare function +template +inline void heapsink(T*array, s32 element, s32 max, Compare cmp) +{ + while ((element<<1) < max) // there is a left child + { + s32 j = (element<<1); + + if (j+1 < max && cmp(array[j],array[j+1]) ) + j = j+1; // take right child + + if ( cmp( array[element], array[j]) ) + { + T t = array[j]; // swap elements + array[j] = array[element]; + array[element] = t; + element = j; + } + else + return; + } +} + + +//! Sorts an array with size 'size' using heapsort with a custom compare function +template +inline void heapsort(T* array_, s32 size, Compare cmp) +{ + // for heapsink we pretent this is not c++, where + // arrays start with index 0. So we decrease the array pointer, + // the maximum always +2 and the element always +1 + + T* virtualArray = array_ - 1; + s32 virtualSize = size + 2; + s32 i; + + // build heap + + for (i=((size-1)/2); i>=0; --i) + heapsink(virtualArray, i+1, virtualSize-1, cmp); + + // sort array + + for (i=size-1; i>=0; --i) + { + T t = array_[0]; + array_[0] = array_[i]; + array_[i] = t; + heapsink(virtualArray, 1, i + 1, cmp); + } +} + //! Sinks an element into the heap. template inline void heapsink(T*array, s32 element, s32 max) @@ -68,6 +134,5 @@ inline void heapsort(T* array_, s32 size } // end namespace irr - #endif