2template <
typename Container,
typename Comparer>
5 if (inout_container.IsEmpty())
8 QuickSort(inout_container, 0, inout_container.GetCount() - 1, comparer);
11template <
typename T,
typename Comparer>
20template <
typename Container,
typename Comparer>
23 if (inout_container.IsEmpty())
26 InsertionSort(inout_container, 0, inout_container.GetCount() - 1, comparer);
29template <
typename T,
typename Comparer>
38template <
typename Container,
typename Comparer>
39void plSorting::QuickSort(Container& inout_container, plUInt32 uiStartIndex, plUInt32 uiEndIndex,
const Comparer& in_comparer)
41 if (uiStartIndex < uiEndIndex)
43 if (uiEndIndex - uiStartIndex <= INSERTION_THRESHOLD)
45 InsertionSort(inout_container, uiStartIndex, uiEndIndex, in_comparer);
49 const plUInt32 uiPivotIndex = Partition(inout_container, uiStartIndex, uiEndIndex, in_comparer);
51 plUInt32 uiFirstHalfEndIndex = uiPivotIndex > 0 ? uiPivotIndex - 1 : 0;
52 plUInt32 uiSecondHalfStartIndex = uiPivotIndex + 1;
54 while (uiFirstHalfEndIndex > uiStartIndex && !DoCompare(in_comparer, inout_container[uiFirstHalfEndIndex], inout_container[uiPivotIndex]))
56 uiFirstHalfEndIndex--;
59 while (uiSecondHalfStartIndex <= uiEndIndex && !DoCompare(in_comparer, inout_container[uiPivotIndex], inout_container[uiSecondHalfStartIndex]))
61 uiSecondHalfStartIndex++;
64 if (uiStartIndex < uiFirstHalfEndIndex)
65 QuickSort(inout_container, uiStartIndex, uiFirstHalfEndIndex, in_comparer);
67 if (uiSecondHalfStartIndex < uiEndIndex)
68 QuickSort(inout_container, uiSecondHalfStartIndex, uiEndIndex, in_comparer);
73template <
typename Container,
typename Comparer>
74plUInt32 plSorting::Partition(Container& inout_container, plUInt32 uiLeft, plUInt32 uiRight,
const Comparer& comparer)
76 plUInt32 uiPivotIndex = (uiLeft + uiRight) / 2;
78 if (DoCompare(comparer, inout_container[uiLeft], inout_container[uiRight]))
82 if (DoCompare(comparer, inout_container[uiRight], inout_container[uiPivotIndex]))
85 uiPivotIndex = uiRight;
87 else if (DoCompare(comparer, inout_container[uiLeft], inout_container[uiPivotIndex]))
94 uiPivotIndex = uiLeft;
101 if (DoCompare(comparer, inout_container[uiLeft], inout_container[uiPivotIndex]))
103 uiPivotIndex = uiLeft;
105 else if (DoCompare(comparer, inout_container[uiRight], inout_container[uiPivotIndex]))
112 uiPivotIndex = uiRight;
116 plMath::Swap(inout_container[uiPivotIndex], inout_container[uiRight]);
118 plUInt32 uiIndex = uiLeft;
119 for (plUInt32 i = uiLeft; i < uiRight; ++i)
121 if (DoCompare(comparer, inout_container[i], inout_container[uiRight]))
123 plMath::Swap(inout_container[i], inout_container[uiIndex]);
128 plMath::Swap(inout_container[uiIndex], inout_container[uiRight]);
134template <
typename T,
typename Comparer>
137 T* ptr = inout_arrayPtr.
GetPtr();
139 if (uiStartIndex < uiEndIndex)
141 if (uiEndIndex - uiStartIndex <= INSERTION_THRESHOLD)
143 InsertionSort(inout_arrayPtr, uiStartIndex, uiEndIndex, comparer);
147 const plUInt32 uiPivotIndex = Partition(ptr, uiStartIndex, uiEndIndex, comparer);
149 plUInt32 uiFirstHalfEndIndex = uiPivotIndex > 0 ? uiPivotIndex - 1 : 0;
150 plUInt32 uiSecondHalfStartIndex = uiPivotIndex + 1;
152 while (uiFirstHalfEndIndex > uiStartIndex && !DoCompare(comparer, ptr[uiFirstHalfEndIndex], ptr[uiPivotIndex]))
154 uiFirstHalfEndIndex--;
157 while (uiSecondHalfStartIndex <= uiEndIndex && !DoCompare(comparer, ptr[uiPivotIndex], ptr[uiSecondHalfStartIndex]))
159 uiSecondHalfStartIndex++;
162 if (uiStartIndex < uiFirstHalfEndIndex)
163 QuickSort(inout_arrayPtr, uiStartIndex, uiFirstHalfEndIndex, comparer);
165 if (uiSecondHalfStartIndex < uiEndIndex)
166 QuickSort(inout_arrayPtr, uiSecondHalfStartIndex, uiEndIndex, comparer);
171template <
typename T,
typename Comparer>
172plUInt32 plSorting::Partition(T* pPtr, plUInt32 uiLeft, plUInt32 uiRight,
const Comparer& comparer)
174 plUInt32 uiPivotIndex = (uiLeft + uiRight) / 2;
176 if (DoCompare(comparer, pPtr[uiLeft], pPtr[uiRight]))
180 if (DoCompare(comparer, pPtr[uiRight], pPtr[uiPivotIndex]))
183 uiPivotIndex = uiRight;
185 else if (DoCompare(comparer, pPtr[uiLeft], pPtr[uiPivotIndex]))
192 uiPivotIndex = uiLeft;
199 if (DoCompare(comparer, pPtr[uiLeft], pPtr[uiPivotIndex]))
201 uiPivotIndex = uiLeft;
203 else if (DoCompare(comparer, pPtr[uiRight], pPtr[uiPivotIndex]))
210 uiPivotIndex = uiRight;
216 plUInt32 uiIndex = uiLeft;
217 for (plUInt32 i = uiLeft; i < uiRight; ++i)
219 if (DoCompare(comparer, pPtr[i], pPtr[uiRight]))
232template <
typename Container,
typename Comparer>
233void plSorting::InsertionSort(Container& inout_container, plUInt32 uiStartIndex, plUInt32 uiEndIndex,
const Comparer& comparer)
235 for (plUInt32 i = uiStartIndex + 1; i <= uiEndIndex; ++i)
237 plUInt32 uiHoleIndex = i;
238 while (uiHoleIndex > uiStartIndex && DoCompare(comparer, inout_container[uiHoleIndex], inout_container[uiHoleIndex - 1]))
240 plMath::Swap(inout_container[uiHoleIndex], inout_container[uiHoleIndex - 1]);
246template <
typename T,
typename Comparer>
249 T* ptr = inout_arrayPtr.
GetPtr();
251 for (plUInt32 i = uiStartIndex + 1; i <= uiEndIndex; ++i)
253 plUInt32 uiHoleIndex = i;
254 T valueToInsert = std::move(ptr[uiHoleIndex]);
256 while (uiHoleIndex > uiStartIndex && DoCompare(comparer, valueToInsert, ptr[uiHoleIndex - 1]))
261 const plUInt32 uiMoveCount = i - uiHoleIndex;
269 ptr[uiHoleIndex] = std::move(valueToInsert);
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
PL_ALWAYS_INLINE plUInt32 GetCount() const
Returns the number of elements in the array.
Definition ArrayPtr.h:142
PL_ALWAYS_INLINE PointerType GetPtr() const
Returns the pointer to the array.
Definition ArrayPtr.h:118
PL_ALWAYS_INLINE bool IsEmpty() const
Returns whether the array is empty.
Definition ArrayPtr.h:136
static void MoveConstruct(T *pDestination, T &&source)
Constructs an object of type T in a raw buffer at pDestination, by using move construction from sourc...
static void RelocateOverlapped(T *pDestination, T *pSource, size_t uiCount=1)
Moves objects of type T from pSource to pDestination.
static void QuickSort(Container &inout_container, const Comparer &comparer=Comparer())
Sorts the elements in container using a in-place quick sort implementation (not stable).
Definition Sorting_inl.h:3
static void InsertionSort(Container &inout_container, const Comparer &comparer=Comparer())
Sorts the elements in container using insertion sort (stable and in-place).
Definition Sorting_inl.h:21
PL_ALWAYS_INLINE void Swap(T &ref_f1, T &ref_f2)
Swaps the values in the two variables f1 and f2.
Definition Math_inl.h:224