From 39af3c219481b2083b467295043e320bca5ebb02 Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Wed, 27 Jul 2022 15:31:34 -0400 Subject: [PATCH] Add ArraySort() --- src/Array.c | 50 +++++++++++++++++++++++++++++++++++++++++++++ src/include/Array.h | 3 +++ 2 files changed, 53 insertions(+) diff --git a/src/Array.c b/src/Array.c index 622db0a..7ff6297 100644 --- a/src/Array.c +++ b/src/Array.c @@ -174,3 +174,53 @@ ArrayTrim(Array * array) return 1; } + +static void +ArraySwap(Array * array, size_t i, size_t j) +{ + void *p = array->entries[i]; + + array->entries[i] = array->entries[j]; + array->entries[j] = p; +} + +static size_t +ArrayPartition(Array * array, size_t low, size_t high, int (*compare) (void *, void *)) +{ + void *pivot = array->entries[high]; + size_t i = low - 1; + size_t j; + + for (j = low; j <= high - 1; j++) + { + if (compare(array->entries[j], pivot) < 0) + { + i++; + ArraySwap(array, i, j); + } + } + ArraySwap(array, i + 1, high); + return i + 1; +} + +static void +ArrayQuickSort(Array * array, size_t low, size_t high, int (*compare) (void *, void *)) +{ + if (low < high) + { + size_t pi = ArrayPartition(array, low, high, compare); + + ArrayQuickSort(array, low, pi - 1, compare); + ArrayQuickSort(array, pi + 1, high, compare); + } +} + +void +ArraySort(Array * array, int (*compare) (void *, void *)) +{ + if (!array) + { + return; + } + ArrayQuickSort(array, 0, array->size, compare); +} diff --git a/src/include/Array.h b/src/include/Array.h index 8c0ecdc..48e92e8 100644 --- a/src/include/Array.h +++ b/src/include/Array.h @@ -23,6 +23,9 @@ extern int extern void * ArrayDelete(Array * array, size_t index); +extern void + ArraySort(Array *, int (*compare) (void *, void *)); + extern void ArrayFree(Array * array);