packages feed

sym-0.2: cbits/simple.c

#include <stdlib.h>
#include <string.h>

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

/*
 * Determines whether a permutation is simple.
 * Based on Michael Albert's java implementation in PermLab.
 */
int
simple(const long *w, long len)
{
	register int i, j;
	int size  = len * sizeof(*w);
	long *mins = malloc(size);
	long *maxs = malloc(size);
	
	memcpy(mins, w, size);
	memcpy(maxs, w, size);
	
	for (i = 1; i < len-1; i++) {
		for (j = len-1; j >= i; j--) {
			mins[j] = MIN(mins[j-1], w[j]);
			maxs[j] = MAX(maxs[j-1], w[j]);
			if (maxs[j] - mins[j] == i) {
				free(mins);
				free(maxs);
				return 0;
			}
		}
	}
	free(mins);
	free(maxs);
	return 1;
}