FastLED 3.10.8
Loading...
Searching...
No Matches

◆ qsort_partition()

static size_t fl::qsort_partition ( char * base,
size_t nmemb,
size_t size,
qsort_compare_fn compar )
static

Definition at line 415 of file cstdlib.cpp.hpp.

415 {
416 // Use median-of-three for pivot selection
417 size_t mid = nmemb / 2;
418 size_t last = nmemb - 1;
419
420 char* first_elem = base;
421 char* mid_elem = base + mid * size;
422 char* last_elem = base + last * size;
423
424 // Sort first, middle, last to find median
425 if (compar(mid_elem, first_elem) < 0) {
426 detail::qsort_swap(first_elem, mid_elem, size);
427 }
428 if (compar(last_elem, first_elem) < 0) {
429 detail::qsort_swap(first_elem, last_elem, size);
430 }
431 if (compar(last_elem, mid_elem) < 0) {
432 detail::qsort_swap(mid_elem, last_elem, size);
433 }
434
435 // Now mid_elem contains the median, swap it to end-1 position
436 detail::qsort_swap(mid_elem, base + (last - 1) * size, size);
437 char* pivot = base + (last - 1) * size;
438
439 // Partition
440 size_t i = 0;
441 for (size_t j = 0; j < last - 1; ++j) {
442 if (compar(base + j * size, pivot) < 0) {
443 if (i != j) {
444 detail::qsort_swap(base + i * size, base + j * size, size);
445 }
446 ++i;
447 }
448 }
449
450 // Move pivot to its final position
451 detail::qsort_swap(base + i * size, pivot, size);
452 return i;
453}
void qsort_swap(char *a, char *b, size_t size) FL_NO_EXCEPT

References FL_NO_EXCEPT, and fl::detail::qsort_swap().

Referenced by fl::detail::qsort_impl().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: