Merge Sort Visualizer
Watch the Divide and Conquer strategy: recursively divide the array, then merge sorted subarrays
Array Size: 7Comparisons: 0Merges: 0
38
[0]27
[1]43
[2]3
[3]9
[4]82
[5]10
[6]Unsorted
Dividing
Left Array
Right Array
Merging
Sorted
Merge Sort Implementation:
public static void mergeSort(int[] arr, int left, int right) {
if (left >= right) {
return; // Base case: single element
}
// Divide
int mid = (left + right) / 2;
mergeSort(arr, left, mid); // Sort left half
mergeSort(arr, mid + 1, right); // Sort right half
// Conquer (Merge)
merge(arr, left, mid, right);
}
private static void merge(int[] arr, int left, int mid, int right) {
// Create temp arrays
int[] leftArr = Arrays.copyOfRange(arr, left, mid + 1);
int[] rightArr = Arrays.copyOfRange(arr, mid + 1, right + 1);
int i = 0, j = 0, k = left;
// Merge back into original array
while (i < leftArr.length && j < rightArr.length) {
if (leftArr[i] <= rightArr[j]) {
arr[k++] = leftArr[i++];
} else {
arr[k++] = rightArr[j++];
}
}
// Copy remaining elements
while (i < leftArr.length) arr[k++] = leftArr[i++];
while (j < rightArr.length) arr[k++] = rightArr[j++];
}
// Time Complexity: O(n log n) - Always!
// Space Complexity: O(n) - For temporary arrays
// Stability: Stable sort (maintains relative order)💡 Merge Sort Advantages:
- Guaranteed O(n log n) time - even in worst case!
- Stable sort - preserves order of equal elements
- Predictable performance - no worst-case scenarios
- Great for large datasets and linked lists
- Divide and Conquer - elegant recursive solution