Upstream simple-statistics/simple-statistics state of the touched files before afe3d20779
This commit is contained in:
1 parent
24fe35e78e
commit
cd7bef4165
2 files changed
+62
No files matched your search
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Implementation of [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm)
|
||||
* for generating permutations.
|
||||
*
|
||||
* @param {Array} elements any type of data
|
||||
* @returns {Array<Array>} array of permutations
|
||||
*/
|
||||
function permutationsHeap(elements) {
|
||||
const indexes = new Array(elements.length);
|
||||
const permutations = [elements.slice()];
|
||||
|
||||
for (let i = 0; i < elements.length; i++) {
|
||||
indexes[i] = 0;
|
||||
}
|
||||
|
||||
for (let i = 0; i < elements.length; ) {
|
||||
if (indexes[i] < i) {
|
||||
// At odd indexes, swap from indexes[i] instead
|
||||
// of from the beginning of the array
|
||||
let swapFrom = 0;
|
||||
if (i % 2 !== 0) {
|
||||
swapFrom = indexes[i];
|
||||
}
|
||||
|
||||
// swap between swapFrom and i, using
|
||||
// a temporary variable as storage.
|
||||
const temp = elements[swapFrom];
|
||||
elements[swapFrom] = elements[i];
|
||||
elements[i] = temp;
|
||||
|
||||
permutations.push(elements.slice());
|
||||
indexes[i]++;
|
||||
i = 0;
|
||||
} else {
|
||||
indexes[i] = 0;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
return permutations;
|
||||
}
|
||||
|
||||
export default permutationsHeap;
|
||||
@@ -0,0 +1,19 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { describe, it } from "node:test";
|
||||
import * as ss from "../index.js";
|
||||
|
||||
describe("permutationsHeap", function () {
|
||||
it("generates 1 permutation", function () {
|
||||
assert.deepEqual(ss.permutationsHeap([1]), [[1]]);
|
||||
});
|
||||
it("generates 1, 2, 3 permutations", function () {
|
||||
assert.deepEqual(ss.permutationsHeap([1, 2, 3]), [
|
||||
[1, 2, 3],
|
||||
[2, 1, 3],
|
||||
[3, 1, 2],
|
||||
[1, 3, 2],
|
||||
[2, 3, 1],
|
||||
[3, 2, 1]
|
||||
]);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user