1
// Copyright (C) 2002-2011 Nikolaus Gebhardt
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#ifndef __IRR_HEAPSORT_H_INCLUDED__
6
#define __IRR_HEAPSORT_H_INCLUDED__
15
//! Sinks an element into the heap.
17
inline void heapsink(T*array, s32 element, s32 max)
19
while ((element<<1) < max) // there is a left child
23
if (j+1 < max && array[j] < array[j+1])
24
j = j+1; // take right child
26
if (array[element] < array[j])
28
T t = array[j]; // swap elements
29
array[j] = array[element];
39
//! Sorts an array with size 'size' using heapsort.
41
inline void heapsort(T* array_, s32 size)
43
// for heapsink we pretent this is not c++, where
44
// arrays start with index 0. So we decrease the array pointer,
45
// the maximum always +2 and the element always +1
47
T* virtualArray = array_ - 1;
48
s32 virtualSize = size + 2;
53
for (i=((size-1)/2); i>=0; --i)
54
heapsink(virtualArray, i+1, virtualSize-1);
56
// sort array, leave out the last element (0)
57
for (i=size-1; i>0; --i)
60
array_[0] = array_[i];
62
heapsink(virtualArray, 1, i + 1);
66
} // end namespace core
67
} // end namespace irr