From ec76ed2d14eda05f8d2c81e0b7aacdc079f2b275 Mon Sep 17 00:00:00 2001 From: Gregory Lirent Date: Wed, 8 Jun 2022 21:19:03 +0300 Subject: [PATCH] Change list sort to stack-based --- src/list/sort.c | 61 +++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/src/list/sort.c b/src/list/sort.c index 9162654..037881f 100644 --- a/src/list/sort.c +++ b/src/list/sort.c @@ -16,38 +16,39 @@ static inline void lnode_swap(lnode_t* s0, lnode_t* s1) { s1->type = t; } -static inline lnode_t* pivot(lnode_t *l, lnode_t *r) { - - lnode_t *c = l->prev; - - for (lnode_t* i = l; i != r; i = i->next) { - if (lnode_compare(i, r) < 0) { - c = (is_null(c)) ? l : c->next; - lnode_swap(c, i); - } - } - - c = (is_null(c)) ? l : c->next; - lnode_swap(c, r); - - return c; -} - -static void quick_sort(lnode_t* l, lnode_t* r) { - lnode_t* p; - - if (!is_null(r) && l != r && l != r->next) { - p = pivot(l, r); - - quick_sort(l, p->prev); - quick_sort(p->next, r); - } -} - -/*#####################################################################################################################*/ void list_sort(list_t* x) { - return quick_sort(x->first, x->last); + stack_t z = { .prev = 0, .value = x->last}; + lnode_t *l; + lnode_t *r; + + stack_push(&z, x->first); + + while (z.value) { + + l = stack_pop(&z); + r = stack_pop(&z); + + if (!is_null(r) && l != r && l != r->next) { + + lnode_t *p = l->prev; + + for (lnode_t* c = l; c != r; c = c->next) { + if (lnode_compare(c, r) < 0) { + p = (is_null(p)) ? l : p->next; + lnode_swap(p, c); + } + } + + p = (is_null(p)) ? l : p->next; + lnode_swap(p, r); + + stack_push(&z, r); + stack_push(&z, p->next); + stack_push(&z, p->prev); + stack_push(&z, l); + } + } }