Esempio n. 1
0
/*
 * 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;
}
Esempio n. 2
0
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;
	}
}
Esempio n. 3
0
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;
		}
	}
}