From 79935eb0b4eaf4c8334194c841bdd4b8621ff3b5 Mon Sep 17 00:00:00 2001 From: Gregory Lirent Date: Sun, 5 Jun 2022 18:35:14 +0300 Subject: [PATCH] Update list sort --- src/list/sort.c | 74 ++++++++++++------------------------------------- 1 file changed, 17 insertions(+), 57 deletions(-) diff --git a/src/list/sort.c b/src/list/sort.c index b4623d9..9162654 100644 --- a/src/list/sort.c +++ b/src/list/sort.c @@ -16,78 +16,38 @@ static inline void lnode_swap(lnode_t* s0, lnode_t* s1) { s1->type = t; } -static inline lnode_t* mid(lnode_t* l, lnode_t *r) { - while (l != r) { - if ((r = r->prev) == l) - break; - l = l->next; - } - - return l; -} - static inline lnode_t* pivot(lnode_t *l, lnode_t *r) { - lnode_t *m = mid(l, r); + lnode_t *c = l->prev; - if (lnode_compare(m, l) < 0) - lnode_swap(m, l); - - if (lnode_compare(m, r) > 0) { - lnode_swap(m, r); - - if (lnode_compare(m, l) < 0) - lnode_swap(m, l); + 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); + } } - return m; + 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; -static void quick_sort(lnode_t *l, lnode_t *r) { + if (!is_null(r) && l != r && l != r->next) { + p = pivot(l, r); - lnode_t *c; - lnode_t *m = pivot(l, r); - lnode_t *n = l; - lnode_t *p = r; - int f = 0; - - for (;;) { - while (lnode_compare(l, m) < 0) { - l = l->next; - if (p == l) /* l >= p */ - f |= 0x01; - } - - c = l->prev; - - while (lnode_compare(r, m) > 0) { - r = r->prev; - if (n == r) /* n >= r */ - f |= 0x02; - if (c == r) /* l > r */ - f |= 0x04; - } - - if (!(f&0x04)) { /* l <= r */ - lnode_swap(l, r); - l = l->next; - r = r->prev;; - } else break; + quick_sort(l, p->prev); + quick_sort(p->next, r); } - - if (!(f&0x02)) /* n < r */ - quick_sort(n, r); - if (!(f&0x01)) /* l < p */ - quick_sort(l, p); } /*#####################################################################################################################*/ void list_sort(list_t* x) { - if (x->first != x->last) - return quick_sort(x->first, x->last);; + return quick_sort(x->first, x->last); }