Irrlicht 3D Engine
heapsort.h
Go to the documentation of this file.
00001 // Copyright (C) 2002-2012 Nikolaus Gebhardt
00002 // This file is part of the "Irrlicht Engine".
00003 // For conditions of distribution and use, see copyright notice in irrlicht.h
00004 
00005 #ifndef __IRR_HEAPSORT_H_INCLUDED__
00006 #define __IRR_HEAPSORT_H_INCLUDED__
00007 
00008 #include "irrTypes.h"
00009 
00010 namespace irr
00011 {
00012 namespace core
00013 {
00014 
00016 template<class T>
00017 inline void heapsink(T*array, s32 element, s32 max)
00018 {
00019     while ((element<<1) < max) // there is a left child
00020     {
00021         s32 j = (element<<1);
00022 
00023         if (j+1 < max && array[j] < array[j+1])
00024             j = j+1; // take right child
00025 
00026         if (array[element] < array[j])
00027         {
00028             T t = array[j]; // swap elements
00029             array[j] = array[element];
00030             array[element] = t;
00031             element = j;
00032         }
00033         else
00034             return;
00035     }
00036 }
00037 
00038 
00040 template<class T>
00041 inline void heapsort(T* array_, s32 size)
00042 {
00043     // for heapsink we pretent this is not c++, where
00044     // arrays start with index 0. So we decrease the array pointer,
00045     // the maximum always +2 and the element always +1
00046 
00047     T* virtualArray = array_ - 1;
00048     s32 virtualSize = size + 2;
00049     s32 i;
00050 
00051     // build heap
00052 
00053     for (i=((size-1)/2); i>=0; --i)
00054         heapsink(virtualArray, i+1, virtualSize-1);
00055 
00056     // sort array, leave out the last element (0)
00057     for (i=size-1; i>0; --i)
00058     {
00059         T t = array_[0];
00060         array_[0] = array_[i];
00061         array_[i] = t;
00062         heapsink(virtualArray, 1, i + 1);
00063     }
00064 }
00065 
00066 } // end namespace core
00067 } // end namespace irr
00068 
00069 #endif
00070