From 16282f8ecddcf84aefab0c0d38eec2b01f9fb6bc Mon Sep 17 00:00:00 2001 From: "Jan (janneke) Nieuwenhuizen" Date: Mon, 24 Oct 2022 22:44:41 +0200 Subject: [PATCH] lib: stdio/qsort: Refactor, fixes GCC-4.6.4. * lib/stdlib/qsort.c (qswap): Refactor. (qpart): Add "lo" parametor, use "hi" instead of count. Refactor. (qsort): Move to... (_qsort): ...this, and refactor. (qsort): New function. --- lib/stdlib/qsort.c | 88 +++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/lib/stdlib/qsort.c b/lib/stdlib/qsort.c index 68352f5c..855f9f3a 100644 --- a/lib/stdlib/qsort.c +++ b/lib/stdlib/qsort.c @@ -19,62 +19,62 @@ * along with GNU Mes. If not, see . */ -#include -#include +/* See: https://en.wikipedia.org/wiki/Quicksort */ -void -qswap (void *a, void *b, size_t size) +#include + +static void +qswap (char *a, char *b, size_t size) { - char *pa = a; - char *pb = b; - do - { - char tmp = *pa; - *pa++ = *pb; - *pb++ = tmp; - } while (--size > 0); + while (size-- > 0) + { + char tmp = *a; + *a++ = *b; + *b++ = tmp; + } } -size_t -qpart (void *base, size_t count, size_t size, int (*compare) (void const *, void const *)) +static size_t +qpart (char *base, size_t lo, size_t hi, size_t size, + int (*compare) (void const *, void const *)) { - void *p = base + count * size; - size_t i = 0; - for (size_t j = 0; j < count; j++) + char *pivot = base + hi * size; + size_t i = lo; + + for (size_t j = lo; j < hi; j++) { - int c = compare (base + j * size, p); - if (c < 0) + char *pj = base + j * size; + if (pj != pivot && compare (pj, pivot) < 0) { -#if 1 //__x86_64__ - qswap (base + i * size, base + j * size, size); -#else - int p1 = base + i * size; - int p2 = base + j * size; - qswap (p1, p2, size); -#endif + void *pi = base + i * size; + qswap (pi, pj, size); i++; } - else if (c == 0) - i++; } - if (compare (base + count * size, base + i * size) < 0) - qswap (base + i * size, base + count * size, size); + + char *pi = base + i * size; + qswap (pi, pivot, size); + return i; } -void -qsort (void *base, size_t count, size_t size, int (*compare) (void const *, void const *)) +static void +_qsort (void *base, size_t lo, size_t hi, size_t size, + int (*compare) (void const *, void const *)) { - if (count > 1) - { - int p = qpart (base, count - 1, size, compare); - qsort (base, p, size, compare); -#if 1 //__x86_64__ - qsort (base + p * size, count - p, size, compare); -#else - int p1 = base + p * size; - int p2 = count - p; - qsort (p1, p2, size, compare); -#endif - } + if (lo >= hi) + return; + size_t pi = qpart (base, lo, hi, size, compare); + if (pi > 0) + _qsort (base, lo, pi - 1, size, compare); + _qsort (base, pi + 1, hi, size, compare); +} + +void +qsort (void *base, size_t count, size_t size, + int (*compare) (void const *, void const *)) +{ + if (count <= 1) + return; + _qsort (base, 0, count - 1, size, compare); }