/* * dlist_qsort_3: * * recursive function that implements quicksort with a three-way partition * on an array of slist_node_t structures. */ static void dlist_qsort_3(dlist_node_t **a, dlist_cmp_t cmp, int l, int r) { dlist_node_t *c; int i, lt, gt, rc; if(l >= r) return; c = a[l]; lt = l; gt = r; i = l; while(i <= gt) { rc = a[i]->item != c->item ? cmp(a[i]->item, c->item) : 0; if(rc < 0) dlist_swap(a, lt++, i++); else if(rc > 0) dlist_swap(a, i, gt--); else i++; } dlist_qsort_3(a, cmp, l, lt-1); dlist_qsort_3(a, cmp, gt+1, r); return; }
void dlist_reverse(dlist *l) { dlist *iter1 = dlist_first(l), *iter2 = dlist_last(l); while(iter1 != iter2) { dlist_swap(iter1, iter2); if(iter1->next == iter2) break; iter1 = iter1->next; iter2 = iter2->prev; } }
void dlist_sort(dlist *l, dlist_cmp_func cmp, void *data) { dlist *start = dlist_first(l); while(start) { dlist *iter = start; start = 0; while(iter) { if(iter->next && cmp(iter, iter->next, data) == 1) { dlist_swap(iter, iter->next); if(! start) start = iter->prev; } iter = iter->next; } } }