Merge Two Sorted Arrays Without Extra Space in DSA Javascript - Time & Space Complexity
We want to know how long it takes to merge two sorted arrays without using extra space.
How does the time needed grow as the arrays get bigger?
Analyze the time complexity of the following code snippet.
function merge(arr1, arr2) {
let i = 0, j = 0;
while (i < arr1.length) {
if (arr1[i] > arr2[0]) {
[arr1[i], arr2[0]] = [arr2[0], arr1[i]];
let first = arr2[0];
let k = 1;
while (k < arr2.length && arr2[k] < first) {
arr2[k - 1] = arr2[k];
k++;
}
arr2[k - 1] = first;
}
i++;
}
}
This code merges two sorted arrays by swapping elements and keeping the second array sorted without extra space.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Outer while loop runs through all elements of the first array.
- Nested operation: Inner while loop shifts elements in the second array to keep it sorted after a swap.
- How many times: Outer loop runs n times (size of first array), inner loop can run up to m times (size of second array) in worst case.
As the arrays get bigger, the number of operations grows because for each element in the first array, we might shift many elements in the second array.
| Input Size (n, m) | Approx. Operations |
|---|---|
| 10, 10 | Up to 100 (10 * 10) |
| 100, 100 | Up to 10,000 (100 * 100) |
| 1000, 1000 | Up to 1,000,000 (1000 * 1000) |
Pattern observation: The operations grow roughly by the product of the sizes of the two arrays, meaning it grows much faster as arrays get larger.
Time Complexity: O(n * m)
This means the time needed grows proportionally to the size of the first array times the size of the second array.
[X] Wrong: "Since both arrays are sorted, merging without extra space is always fast and close to O(n + m)."
[OK] Correct: The inner shifting loop can cause many moves, making the process slower than a simple linear pass, especially when many swaps happen.
Understanding this time complexity helps you explain trade-offs when merging arrays without extra space, showing your grasp of algorithm efficiency and practical coding skills.
"What if we used a gap method (Shell sort idea) to reduce the number of shifts? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem requirement
The problem asks to merge two sorted arrays into a single sorted sequence without using extra space, meaning no additional arrays or large memory allocations.Step 2: Identify the approach
We must rearrange elements within the given arrays themselves to maintain sorted order combined.Final Answer:
Combine both arrays into one sorted array without using extra memory -> Option DQuick Check:
Merge without extra space = Combine in-place [OK]
- Assuming extra arrays are allowed
- Sorting arrays separately without merging
- Copying elements without sorting
a[i] and b[j] without using a temporary variable?Solution
Step 1: Identify correct swap syntax in JavaScript
Using destructuring assignment,[a[i], b[j]] = [b[j], a[i]];swaps values without a temporary variable.Step 2: Check other options
temp = a[i]; a[i] = b[j]; b[j] = temp; uses a temporary variable, C incorrectly assigns twice, D is invalid syntax.Final Answer:
[a[i], b[j]] = [b[j], a[i]]; -> Option AQuick Check:
Destructuring swap = [a[i], b[j]] = [b[j], a[i]]; [OK]
- Using invalid syntax like option D
- Forgetting to use a temporary variable if not destructuring
- Assigning values incorrectly causing data loss
a and b after running this code?let a = [1, 5, 9, 10];
let b = [2, 3, 8, 13];
for (let i = 0; i < a.length; i++) {
if (a[i] > b[0]) {
[a[i], b[0]] = [b[0], a[i]];
b.sort((x, y) => x - y);
}
}Solution
Step 1: Trace the loop and swaps
i=0: a[0]=1 <= b[0]=2 no swap
i=1: a[1]=5 > b[0]=2 swap -> a[1]=2, b[0]=5; b sorted: [3,5,8,13]
i=2: a[2]=9 > b[0]=3 swap -> a[2]=3, b[0]=9; b sorted: [5,8,9,13]
i=3: a[3]=10 > b[0]=5 swap -> a[3]=5, b[0]=10; b sorted: [8,9,10,13]Step 2: Final arrays after loop
a = [1, 2, 3, 5]
b = [8, 9, 10, 13]Final Answer:
a = [1, 2, 3, 5], b = [8, 9, 10, 13] -> Option AQuick Check:
Swapped and sorted b each time = a = [1, 2, 3, 5], b = [8, 9, 10, 13] [OK]
- Not sorting array b after swap
- Swapping incorrectly causing wrong order
- Assuming arrays merge into one
let a = [1, 4, 7];
let b = [2, 5, 6];
for (let i = 0; i < a.length; i++) {
if (a[i] > b[0]) {
let temp = a[i];
a[i] = b[0];
b[0] = temp;
}
b.sort();
}Solution
Step 1: Check the sorting method used
The code usesb.sort()without a compare function, which sorts elements as strings, not numbers, causing wrong order.Step 2: Correct sorting approach
Useb.sort((x, y) => x - y)to sort numbers correctly.Final Answer:
The sort() method is called without a compare function, causing incorrect sorting -> Option BQuick Check:
sort() without compare = wrong numeric order [OK]
- Using default sort() for numbers
- Swapping incorrectly without temp variable
- Wrong loop range
a = [1, 3, 5, 7] and b = [0, 2, 6, 8, 9], how can you merge them without extra space so that after merging, a contains the first 4 smallest elements and b contains the remaining elements sorted? Which approach is best?Solution
Step 1: Understand the gap method
The gap method compares elements at a certain gap distance in both arrays and swaps if needed, reducing the gap until 1, ensuring sorted order without extra space.Step 2: Why other options fail
Concatenate arrays and sort the combined array and D use extra space, violating constraints. Swap elements only if a[i] > b[j] without sorting b after swaps misses sorting after swaps, causing incorrect order.Final Answer:
Use a gap method to compare and swap elements between arrays until fully sorted -> Option CQuick Check:
Gap method = in-place merge without extra space [OK]
- Using extra arrays violating constraints
- Not sorting after swaps causing disorder
- Assuming simple swaps suffice without gap reduction
Ready to prove it?
Pass the test and this pattern moves unknown
