Skip to content

Instantly share code, notes, and snippets.

@ceautery
Created December 23, 2015 13:19
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 ceautery/4240087f1bfbcebc6cb7 to your computer and use it in GitHub Desktop.
Save ceautery/4240087f1bfbcebc6cb7 to your computer and use it in GitHub Desktop.
Non-recursive Heap's Algorithm in JavaScript, with a callback
function iterate(arr, callback) {
var fac = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800];
function swap(a, b) {
var tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
callback(arr);
for (var iter = 1, last = fac[arr.length]; iter < last; iter++) {
if (iter % 2) swap(0, 1);
else if (iter % 6) swap(0, 2);
else {
var cycle = arr.length - 1;
while (iter % fac[cycle] > 0) cycle--;
var left = cycle % 2 == 0 ? 0 : (iter / fac[cycle] - 1) % (cycle + 1);
swap(left, cycle);
}
callback(arr);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment