4 /* Combine two sorted lists. Take from `list` on equality. */
5 static void *llist_merge(void *list
, void *other
,
6 void *(*get_next_fn
)(const void *),
7 void (*set_next_fn
)(void *, void *),
8 int (*compare_fn
)(const void *, const void *))
10 void *result
= list
, *tail
;
12 if (compare_fn(list
, other
) > 0) {
19 list
= get_next_fn(list
);
21 set_next_fn(tail
, other
);
24 } while (compare_fn(list
, other
) <= 0);
25 set_next_fn(tail
, other
);
29 other
= get_next_fn(other
);
31 set_next_fn(tail
, list
);
34 } while (compare_fn(list
, other
) > 0);
35 set_next_fn(tail
, list
);
40 * Perform an iterative mergesort using an array of sublists.
42 * n is the number of items.
43 * ranks[i] is undefined if n & 2^i == 0, and assumed empty.
44 * ranks[i] contains a sublist of length 2^i otherwise.
46 * The number of bits in a void pointer limits the number of objects
47 * that can be created, and thus the number of array elements necessary
48 * to be able to sort any valid list.
50 * Adding an item to this array is like incrementing a binary number;
51 * positional values for set bits correspond to sublist lengths.
53 void *llist_mergesort(void *list
,
54 void *(*get_next_fn
)(const void *),
55 void (*set_next_fn
)(void *, void *),
56 int (*compare_fn
)(const void *, const void *))
58 void *ranks
[bitsizeof(void *)];
63 void *next
= get_next_fn(list
);
65 set_next_fn(list
, NULL
);
66 for (i
= 0; n
& ((size_t)1 << i
); i
++)
67 list
= llist_merge(ranks
[i
], list
, get_next_fn
,
68 set_next_fn
, compare_fn
);
74 for (i
= 0; n
; i
++, n
>>= 1) {
78 list
= llist_merge(ranks
[i
], list
, get_next_fn
,
79 set_next_fn
, compare_fn
);