32 #ifndef ACE_SORTING_QUICK_SORT_H
33 #define ACE_SORTING_QUICK_SORT_H
37 #if ! defined(ACE_SORTING_DIRECT_QUICK_SORT)
48 #define ACE_SORTING_DIRECT_QUICK_SORT 1
51 namespace ace_sorting {
62 #if ACE_SORTING_DIRECT_QUICK_SORT
67 T pivot = data[n / 2];
69 T* right = data + n - 1;
71 while (left <= right) {
74 }
else if (pivot < *right) {
88 void quickSortMiddle(T data[], uint16_t n) {
94 auto&& lessThan = [](
const T& a,
const T& b) ->
bool {
return a < b; };
106 template <
typename T,
typename F>
110 T pivot = data[n / 2];
112 T* right = data + n - 1;
114 while (left <= right) {
115 if (lessThan(*left, pivot)) {
117 }
else if (lessThan(pivot, *right)) {
141 #if ACE_SORTING_DIRECT_QUICK_SORT
142 template <
typename T>
150 uint16_t mid = n / 2;
152 if (data[n - 1] < data[0]) {
153 swap(data[0], data[n - 1]);
155 if (pivot < data[0]) {
157 }
else if (data[n - 1] < pivot) {
162 T* right = data + n - 1;
164 while (left <= right) {
167 }
else if (pivot < *right) {
180 template <
typename T>
181 void quickSortMedian(T data[], uint16_t n) {
184 auto&& lessThan = [](
const T& a,
const T& b) ->
bool {
return a < b; };
196 template <
typename T,
typename F>
204 uint16_t mid = n / 2;
206 if (lessThan(data[n - 1], data[0])) {
207 swap(data[0], data[n - 1]);
209 if (lessThan(pivot, data[0])) {
211 }
else if (lessThan(data[n - 1], pivot)) {
216 T* right = data + n - 1;
218 while (left <= right) {
219 if (lessThan(*left, pivot)) {
221 }
else if (lessThan(pivot, *right)) {
245 #if ACE_SORTING_DIRECT_QUICK_SORT
246 template <
typename T>
252 uint16_t mid = n / 2;
254 if (data[n - 1] < data[0]) {
255 swap(data[0], data[n - 1]);
257 if (pivot < data[0]) {
258 swap(data[0], data[mid]);
259 }
else if (data[n - 1] < pivot) {
260 swap(data[mid], data[n - 1]);
266 T* right = data + n - 2;
268 while (left <= right) {
271 }
else if (pivot < *right) {
284 template <
typename T>
285 void quickSortMedianSwapped(T data[], uint16_t n) {
288 auto&& lessThan = [](
const T& a,
const T& b) ->
bool {
return a < b; };
300 template <
typename T,
typename F>
306 uint16_t mid = n / 2;
308 if (lessThan(data[n - 1], data[0])) {
309 swap(data[0], data[n - 1]);
311 if (lessThan(pivot, data[0])) {
312 swap(data[0], data[mid]);
313 }
else if (lessThan(data[n - 1], pivot)) {
314 swap(data[mid], data[n - 1]);
320 T* right = data + n - 2;
322 while (left <= right) {
323 if (lessThan(*left, pivot)) {
325 }
else if (lessThan(pivot, *right)) {