376 {
377
378 size_t mid = nmemb / 2;
379 size_t last = nmemb - 1;
380
381 char* first_elem = base;
382 char* mid_elem = base + mid * size;
383 char* last_elem = base + last * size;
384
385
386 if (compar(mid_elem, first_elem) < 0) {
388 }
389 if (compar(last_elem, first_elem) < 0) {
391 }
392 if (compar(last_elem, mid_elem) < 0) {
394 }
395
396
398 char* pivot = base + (last - 1) * size;
399
400
401 size_t i = 0;
402 for (size_t j = 0; j < last - 1; ++j) {
403 if (compar(base + j * size, pivot) < 0) {
404 if (i != j) {
406 }
407 ++i;
408 }
409 }
410
411
413 return i;
414}
void qsort_swap(char *a, char *b, size_t size)