permute
Version:
A tiny library to permutate a sequence.
65 lines (55 loc) • 1.46 kB
JavaScript
/*
* Copyright (c) 2013, Ben Noordhuis <info@bnoordhuis.nl>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
module.exports = permute;
function permute(seq)
{
var i, j, v;
var end;
if (seq.length <= 1) {
return false;
}
i = end = seq.length - 1;
for (;;) {
v = seq[i];
i -= 1;
if (seq[i] < v) {
v = seq[i];
for (j = end; seq[j] < v; j -= 1);
swap(seq, i, j);
reverse(seq, i + 1, end);
return true;
}
if (i === 0) {
reverse(seq, 0, end);
return false;
}
}
return true;
}
function reverse(seq, start, end)
{
while (start < end) {
swap(seq, start, end);
start += 1;
end -= 1;
}
}
function swap(seq, i, j)
{
var t = seq[i];
seq[i] = seq[j];
seq[j] = t;
}