1. Introduction
Merge Sort is a well-known, efficient, and stable sorting algorithm based on the Divide and Conquer paradigm.
Instead of sorting the array directly, it divides the array into smaller subarrays, sorts them individually, and then merges them into a fully sorted array.
2. Key Properties of Merge Sort
Property | Description |
Time Complexity | O(n log n) for all cases (best, average, worst) |
Space Complexity | O(n) – uses temporary arrays during merge |
Stable | Yes, it maintains the relative order of equal elements |
Recursive | Yes (most commonly implemented recursively) |
In-Place | No, uses additional memory |
3. Merge Sort Conceptual Steps
Given an array:
[38, 27, 43, 3, 9, 82, 10]
The process works in the following two main phases:
3.1 Divide Phase
Keep dividing the array into two halves recursively until each subarray has only one element.
[38, 27, 43, 3, 9, 82, 10] → [38, 27, 43, 3] and [9, 82, 10] → [38, 27] [43, 3] [9, 82] [10] → [38] [27] [43] [3] [9] [82] [10]
3.2 Conquer (Merge Phase)
Merge the subarrays while sorting them during the merge.
[38] + [27] → [27, 38] [43] + [3] → [3, 43] [9] + [82] → [9, 82] [10] remains as it is Then: [27, 38] + [3, 43] → [3, 27, 38, 43] [9, 82] + [10] → [9, 10, 82] Final: [3, 27, 38, 43] + [9, 10, 82] → [3, 9, 10, 27, 38, 43, 82]
4. Java Implementation of Merge Sort
public class MergeSort { public static void main(String[] args) { int[] array = {38, 27, 43, 3, 9, 82, 10}; System.out.println("Original Array:"); printArray(array); mergeSort(array, 0, array.length - 1); System.out.println("Sorted Array:"); printArray(array); } // Recursive mergeSort function public static void mergeSort(int[] arr, int left, int right) { if (left < right) { // Find the middle point int middle = left + (right - left) / 2; // Recursively sort the left half mergeSort(arr, left, middle); // Recursively sort the right half mergeSort(arr, middle + 1, right); // Merge the sorted halves merge(arr, left, middle, right); } } // Merges two subarrays of arr[] public static void merge(int[] arr, int left, int middle, int right) { // Find sizes of two subarrays to be merged int n1 = middle - left + 1; int n2 = right - middle; // Create temporary arrays int[] L = new int[n1]; int[] R = new int[n2]; // Copy data to temp arrays for (int i = 0; i < n1; ++i) L[i] = arr[left + i]; for (int j = 0; j < n2; ++j) R[j] = arr[middle + 1 + j]; // Merge the temp arrays // Initial indexes of first and second subarrays int i = 0, j = 0; // Initial index of merged subarray int k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k++] = L[i++]; } else { arr[k++] = R[j++]; } } // Copy remaining elements of L[] while (i < n1) { arr[k++] = L[i++]; } // Copy remaining elements of R[] while (j < n2) { arr[k++] = R[j++]; } } // Utility function to print the array public static void printArray(int[] arr) { for (int value : arr) System.out.print(value + " "); System.out.println(); } }
5. Advantages of Merge Sort
- Consistent Performance: O(n log n) for all inputs.
- Stable: Keeps order of equal elements.
- Works well with Linked Lists: Since insertion and merge are efficient.
- Predictable Behavior: Good for real-time systems.
6. Disadvantages
- Extra Space Needed: Requires temporary arrays.
- Not In-place: Unlike Quick Sort, it uses O(n) auxiliary space.
- Slower on Small Datasets: Insertion sort can be better for tiny arrays.