“Sorted Merge: You are given two sorted arrays, A and B, where A has a
large enough buffer at the end to hold B. Write a method to merge B into A in
sorted order.”
Arrays are already sorted, so we can just do an insertion sort: iterate both,
taking the next sorted item from each and insert it into A which has space for
both.
It would be tricky to insert at the beginning, though, as we’d have to shift the
existing elements in A. So we can do the insertion sort in reverse order, taking
the largest element at a time from the end of each array and adding it to the
moving end of A.
Solving this in JS, which doesn’t really have allocated arrays, but simulating
that with null items.
function sortedMergeInPlace(arrayA, arrayB) {
let indexA = (arrayA.length - arrayB.length) - 1;
let indexB = arrayB.length - 1;
let indexMerged = arrayA.length - 1;
while (indexMerged >= 0) {
if (indexA >= 0 && arrayA[indexA] > arrayB[indexB]) {
arrayA[indexMerged] = arrayA[indexA];
indexA--;
} else {
// We've either run out of A items, or B is larger.
arrayA[indexMerged] = arrayB[indexB];
indexB--;
}
indexMerged--;
}
}
const A = [3, 5, 6, 7, 8, null, null, null];
const B = [2, 4, 9];
sortedMergeInPlace(A, B);
console.log(JSON.stringify(A));
// [2, 3, 4, 5, 6, 7, 8, 9]
View post:
Cracking the Coding Interview 6thE 10.1 Sorted Merge
|