diff options
| author | Jakob Kaivo <jkk@ung.org> | 2020-08-15 11:26:40 -0400 |
|---|---|---|
| committer | Jakob Kaivo <jkk@ung.org> | 2020-08-15 11:26:40 -0400 |
| commit | 3d38446f71e16735b2525f37dd1eb87d91c0e895 (patch) | |
| tree | 491d0e896be22a01e600298853376eb23940b084 /src/stdlib/_qsort.h | |
| parent | 8306c893b485d1931d4055b0ae7d9f794ceaaaa8 (diff) | |
first draft of qsort()
Diffstat (limited to 'src/stdlib/_qsort.h')
| -rw-r--r-- | src/stdlib/_qsort.h | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/stdlib/_qsort.h b/src/stdlib/_qsort.h new file mode 100644 index 00000000..298e28a1 --- /dev/null +++ b/src/stdlib/_qsort.h @@ -0,0 +1,39 @@ +#include <stdlib.h> +#include <string.h> + +struct __qs { + char *base; + size_t size; + int (*compar)(const void *, const void *); + char buf[64]; + char *swap; +}; + +static void __swap(struct __qs *a, size_t i, size_t j) +{ + memcpy(a->swap, a->base + (a->size * i), a->size); + memcpy(a->base + (a->size * i), a->base + (a->size * j), a->size); + memcpy(a->base + (a->size * j), a->swap, a->size); +} + +static size_t __partition(struct __qs *a, size_t lo, size_t hi) +{ + size_t i = lo, j = 0; + for (j = lo; j < hi; j++) { + if (a->compar(a->base + (a->size * j), a->base + (a->size * hi)) < 0) { + __swap(a, i, j); + i++; + } + } + __swap(a, i, hi); + return i; +} + +static void __qsort(struct __qs *a, size_t lo, size_t hi) +{ + if (lo < hi) { + size_t p = __partition(a, lo, hi); + __qsort(a, lo, p - 1); + __qsort(a, p + 1, hi); + } +} |
