66 lines
2.5 KiB
C++
66 lines
2.5 KiB
C++
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/**
|
|
* Contains source code from the article "Radix Sort Revisited".
|
|
* \file IceRevisitedRadix.h
|
|
* \author Pierre Terdiman
|
|
* \date April, 4, 2000
|
|
*/
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Include Guard
|
|
#ifndef __ICERADIXSORT_H__
|
|
#define __ICERADIXSORT_H__
|
|
|
|
//! Allocate histograms & offsets locally
|
|
#define RADIX_LOCAL_RAM
|
|
|
|
enum RadixHint
|
|
{
|
|
RADIX_SIGNED, //!< Input values are signed
|
|
RADIX_UNSIGNED, //!< Input values are unsigned
|
|
|
|
RADIX_FORCE_DWORD = 0x7fffffff
|
|
};
|
|
|
|
class ICECORE_API RadixSort
|
|
{
|
|
public:
|
|
// Constructor/Destructor
|
|
RadixSort();
|
|
~RadixSort();
|
|
// Sorting methods
|
|
RadixSort& Sort(const udword* input, udword nb, RadixHint hint=RADIX_SIGNED);
|
|
RadixSort& Sort(const float* input, udword nb);
|
|
|
|
//! Access to results. mRanks is a list of indices in sorted order, i.e. in the order you may further process your data
|
|
inline_ const udword* GetRanks() const { return mRanks; }
|
|
|
|
//! mIndices2 gets trashed on calling the sort routine, but otherwise you can recycle it the way you want.
|
|
inline_ udword* GetRecyclable() const { return mRanks2; }
|
|
|
|
// Stats
|
|
udword GetUsedRam() const;
|
|
//! Returns the total number of calls to the radix sorter.
|
|
inline_ udword GetNbTotalCalls() const { return mTotalCalls; }
|
|
//! Returns the number of eraly exits due to temporal coherence.
|
|
inline_ udword GetNbHits() const { return mNbHits; }
|
|
|
|
private:
|
|
#ifndef RADIX_LOCAL_RAM
|
|
udword* mHistogram; //!< Counters for each byte
|
|
udword* mOffset; //!< Offsets (nearly a cumulative distribution function)
|
|
#endif
|
|
udword mCurrentSize; //!< Current size of the indices list
|
|
udword* mRanks; //!< Two lists, swapped each pass
|
|
udword* mRanks2;
|
|
// Stats
|
|
udword mTotalCalls; //!< Total number of calls to the sort routine
|
|
udword mNbHits; //!< Number of early exits due to coherence
|
|
// Internal methods
|
|
void CheckResize(udword nb);
|
|
bool Resize(udword nb);
|
|
};
|
|
|
|
#endif // __ICERADIXSORT_H__
|