Coding Exercise: Merge Sort Using Recursion
Sort array using divide-conquer: split → sort halves → merge.
Example: [64, 34, 25, 12, 22, 11, 90] → [11, 12, 22, 25, 34, 64, 90]
Problem Statement
Input: Unsorted array
Output: Sorted array (ascending)
Stable sort: O(n log n) guaranteed.
Algorithm Steps
1. Divide: split at mid
2. Conquer: recursively sort halves
3. Combine: merge sorted halves
Complete Solution
C++
Merge sort implementation
#include <iostream>
using namespace std;
void merge(int arr[], int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (int i = 0; i < n1; i++) L[i] = arr[left + i];
for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) arr[k++] = L[i++];
else arr[k++] = R[j++];
}
while (i < n1) arr[k++] = L[i++];
while (j < n2) arr[k++] = R[j++];
}
void mergeSort(int arr[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = 7;
mergeSort(arr, 0, n-1);
cout << "Sorted: ";
for (int i = 0; i < n; i++) cout << arr[i] << " ";
return 0;
}
Merge Sort Tree: [38, 27, 43, 3]
TEXT
Divide-conquer-merge visualization
[38,27,43,3]
├── [38,27] ──┬── [38] ── [27] ──→ [27,38]
└── [43,3] ──└── [43] ── [3] ──→ [3,43]
↓
[27,38,3,43] → [3,27,38,43]
Test Cases
TEXT
Expected outputs
[64,34,25,12,22,11,90] → [11,12,22,25,34,64,90]
[5,2,8,1] → [1,2,5,8]
[1] → [1]
Complexity Analysis
Time: O(n log n) - always
Space: O(n) - temp arrays
Stable: Yes ✓
Practice Variations
1. Bottom-up merge sort (iterative)
2. Merge k sorted arrays
3. Count inversions during merge
Conclusion
Mastered merge sort! Classic divide-conquer algorithm.
Next: Quick sort or tree traversals.
Codecrown