Skip to content

Instantly share code, notes, and snippets.

@Yaffle
Created October 26, 2011 12:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Yaffle/1316257 to your computer and use it in GitHub Desktop.
Save Yaffle/1316257 to your computer and use it in GitHub Desktop.
Permutation#Generation_in_lexicographic_order
// http://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
// callback(permutation, even)
function permutations(n, callback) {
n >>>= 0;
var p = n ? [] : null,
even = true;
for (i = 0; i < n; i++) {
p[i] = i;
}
function nextPermutation() {
var k = n - 2,
l = n - 1, t, i;
while (k >= 0 && p[k] > p[k + 1]) {
k--;
}
if (k < 0) {
return null;
}
while (p[k] > p[l]) {
l--;
}
t = p[k];
p[k] = p[l];
p[l] = t;
even = !even;
// reverse
for (i = k + 1; i < n - i + k; i++) {
t = p[n - i + k];
p[n - i + k] = p[i];
p[i] = t;
even = !even;
}
return p;
}
while (p) {
callback(p.slice(0), even);
p = nextPermutation();
}
}
var s = '';
permutations(4, function (p, even) {
s += p.join('') + ' - ' + (even ? 'even' : 'odd') + '\n';
});
alert(s);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment