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