5
void quicksort(int *data, int start, int end) {
11
while(data[++i] < data[end]);
12
while(data[--j >= 0 ? j : end] > data[end]);
23
quicksort(data, start, i-1);
24
quicksort(data, i+1, end);
28
void permute(int *data, int count) {
30
for (i = count-1; i >= 0; i--) {
31
p = (int) ((i+1) * (rand() / (RAND_MAX + 1.0)));
38
void result_add(struct result_node **list, int value) {
39
// make sure we have a list
41
*list = (struct result_node *)malloc(sizeof(struct result_node));
42
(*list)->value = value;
48
struct result_node *cur = *list, *last = NULL;
49
while ((cur != NULL) && (cur->value < value)) {
53
// see what we have to do
55
cur = (struct result_node *)malloc(sizeof(struct result_node));
62
else if (cur->value == value) {
66
else if (last != NULL) {
67
last->next = (struct result_node *)malloc(sizeof(struct result_node));
68
last->next->value = value;
70
last->next->next = cur;
73
*list = (struct result_node *)malloc(sizeof(struct result_node));
74
(*list)->value = value;
80
inline void swapperm(int *data, int i, int j) {
88
void _rec_all_permutations(int *data, int count,
89
void (*callback)(int *data, int count, void *arg, float farg),
90
void *arg, float farg, int n) {
92
callback(data, count, arg, farg);
96
for (c = 0; c < n; c++) {
97
_rec_all_permutations(data, count, callback, arg, farg, n-1);
98
swapperm(data, n%2 == 1 ? 0 : c, n-1);
103
void all_permutations(int *data, int count,
104
void (*callback)(int *data, int count, void *arg, float farg),
105
void *arg, float farg) {
106
_rec_all_permutations(data, count, callback, arg, farg, count);
109
long factorial(int n) {