Merge Two Sorted Arrays Without Extra Space in DSA C - Time & Space Complexity
We want to know how the time needed to merge two sorted arrays without extra space changes as the arrays get bigger.
How does the number of steps grow when the input size increases?
Analyze the time complexity of the following code snippet.
void merge(int arr1[], int arr2[], int n, int m) {
int i = 0, j = 0, k = n - 1;
while (i <= k && j < m) {
if (arr1[i] < arr2[j]) {
i++;
} else {
int temp = arr2[j];
arr2[j] = arr1[k];
arr1[k] = temp;
j++;
k--;
}
}
// Sort both arrays after swapping
qsort(arr1, n, sizeof(int), compare);
qsort(arr2, m, sizeof(int), compare);
}
This code merges two sorted arrays by swapping elements to avoid extra space, then sorts both arrays again.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that compares and swaps elements between the two arrays.
- How many times: Up to n + m times, since i moves forward and k moves backward in arr1, and j moves forward in arr2.
- Secondary operations: Sorting both arrays again using qsort, which internally uses a sorting algorithm like quicksort.
As the arrays get bigger, the number of comparisons and swaps in the while loop grows roughly with the total size of both arrays.
| Input Size (n + m) | Approx. Operations |
|---|---|
| 10 | About 10 to 20 operations in the loop, plus sorting small arrays. |
| 100 | About 100 to 200 operations in the loop, plus sorting arrays of size 100. |
| 1000 | About 1000 to 2000 operations in the loop, plus sorting arrays of size 1000. |
Pattern observation: The loop grows linearly with input size, but sorting adds a factor that grows faster than linear.
Time Complexity: O((n + m) log n + m)
This means the time needed grows a bit faster than the total size of the arrays because of the sorting step after swapping.
[X] Wrong: "The merging without extra space is just a simple linear pass, so it must be O(n + m)."
[OK] Correct: After swapping, the arrays are not fully sorted, so sorting both arrays again takes extra time, which dominates the total time.
Understanding this helps you explain how to handle merging without extra space and why sorting after swapping affects performance. It shows you can analyze combined steps clearly.
"What if we used a gap method (Shell sort style) to merge without sorting at the end? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem requirement
The task is to merge two sorted arrays into a single sorted sequence without using extra space, meaning no additional arrays or large buffers.Step 2: Identify the correct approach
We must rearrange elements within the given arrays to maintain sorted order without allocating extra memory.Final Answer:
Combine both arrays into one sorted array without using extra memory -> Option AQuick Check:
Merge without extra space = Combine in place [OK]
- Thinking extra array is allowed
- Sorting arrays separately without merging
- Copying elements without sorting
Solution
Step 1: Check array declaration syntax in C
Arrays in C are declared using curly braces {} with type and square brackets [].Step 2: Validate each option
int arr1[] = {1, 3, 5}; int arr2[] = {2, 4, 6}; uses correct syntax: int arr[] = {elements}; Options A, B, and D use invalid syntax for arrays in C.Final Answer:
int arr1[] = {1, 3, 5}; int arr2[] = {2, 4, 6}; -> Option DQuick Check:
C arrays use {} for initialization [OK]
- Using parentheses () or square brackets [] for initialization
- Missing data type or brackets
- Assigning arrays without braces
arr1 = {1, 4, 7, 8, 10}arr2 = {2, 3, 9}After merging without extra space, what will be the content of
arr1?Solution
Step 1: Understand merging without extra space
We merge by comparing elements and swapping to keep smallest elements in arr1.Step 2: Merge process
Initial arr1: [1,4,7,8,10], arr2: [2,3,9]
Compare 10 (arr1 last) and 2 (arr2 first), swap -> arr1: [1,4,7,8,2], arr2: [10,3,9]
Sort arr2: [3,9,10]
Repeat swaps and sorts until arr1 holds smallest 5 elements:
Final arr1: [1,2,3,4,7]Final Answer:
[1, 2, 3, 4, 7] -> Option BQuick Check:
Smallest 5 elements in arr1 after merge = [1,2,3,4,7] [OK]
- Not sorting arr2 after swaps
- Assuming arr1 remains unchanged
- Mixing elements without sorting
for (int i = 0; i < n; i++) {
if (arr1[i] > arr2[0]) {
int temp = arr1[i];
arr1[i] = arr2[0];
arr2[0] = temp;
sort(arr2, arr2 + m);
}
}Solution
Step 1: Analyze the loop and sorting
The code swaps elements and sorts arr2 inside the loop for every iteration.Step 2: Identify inefficiency
Sorting arr2 in every iteration is costly and inefficient; better to optimize sorting or use a different approach.Final Answer:
Sorting arr2 inside the loop causes inefficiency -> Option CQuick Check:
Sorting inside loop = inefficient [OK]
- Ignoring performance impact of repeated sorting
- Confusing array sizes for loop limits
- Assuming swap logic is incorrect
arr1 = {1, 5, 9, 10, 15, 20}arr2 = {2, 3, 8, 13}Using the gap method to merge without extra space, what is the final state of
arr2 after merging?Solution
Step 1: Understand the gap method
The gap method compares elements at a gap distance and swaps if out of order, reducing gap until 1.Step 2: Apply gap method to arrays
Initial arr1: [1,5,9,10,15,20], arr2: [2,3,8,13]
After merging, arr1 holds smallest elements: [1,2,3,5,8,9]
arr2 holds remaining elements: [10,13,15,20]Step 3: Final arr2 state
arr2 after merge is [10, 13, 15, 20].Final Answer:
[10, 13, 15, 20] -> Option AQuick Check:
Gap method final arr2 = [10, 13, 15, 20] [OK]
- Confusing final positions of elements in arr2
- Assuming arr2 remains unchanged
- Misapplying gap calculation
Ready to prove it?
Pass the test and this pattern moves unknown
