fix(permutations-heap): do the swaps on a copy of the input
Heap's Algorithm generates each permutation by swapping two elements of a working array in place, and that working array was the argument itself, so permutationsHeap([1, 2, 3]) left the caller holding [3, 2, 1]. Two calls on one array returned different lists, and a frozen array threw. Copy the input up front and swap on the copy, as shuffle and numericSort already do. The returned permutations are unchanged.
This commit is contained in:
1 parent
cd7bef4165
commit
5894b8b560
3 files changed
+35
-8
No files matched your search
@@ -16,4 +16,19 @@ describe("permutationsHeap", function () {
|
||||
[3, 2, 1]
|
||||
]);
|
||||
});
|
||||
it("does not modify the caller's array", function () {
|
||||
const x = [1, 2, 3];
|
||||
ss.permutationsHeap(x);
|
||||
assert.deepEqual(x, [1, 2, 3]);
|
||||
});
|
||||
it("accepts a frozen array", function () {
|
||||
assert.deepEqual(ss.permutationsHeap(Object.freeze([1, 2])), [
|
||||
[1, 2],
|
||||
[2, 1]
|
||||
]);
|
||||
});
|
||||
it("returns the same permutations when called twice on one array", function () {
|
||||
const x = [1, 2, 3];
|
||||
assert.deepEqual(ss.permutationsHeap(x), ss.permutationsHeap(x));
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user