Skip to content

Commit 747a195

Browse files
feat(divide-and-conquer): implement basic merge sort with detailed explanation and step-by-step comments
1 parent e065b45 commit 747a195

1 file changed

Lines changed: 108 additions & 0 deletions

File tree

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/**
2+
* Merge Sort - Basic Implementation
3+
*
4+
* 📌 Concept:
5+
* Merge Sort follows Divide and Conquer approach:
6+
* 1. Divide the array into two halves
7+
* 2. Recursively sort both halves
8+
* 3. Merge the sorted halves
9+
*
10+
* 📊 Time Complexity:
11+
* Best Case : O(n log n)
12+
* Average Case: O(n log n)
13+
* Worst Case : O(n log n)
14+
*
15+
* 📦 Space Complexity:
16+
* O(n) - Uses extra temporary array
17+
*
18+
* ✅ Stable Sorting Algorithm
19+
* (Maintains relative order of equal elements)
20+
*/
21+
public class MergeSortBasic {
22+
23+
public static void main(String[] args) {
24+
int[] arr = {38, 27, 43, 3, 9, 82, 10};
25+
26+
System.out.println("Before Sorting:");
27+
printArray(arr);
28+
29+
mergeSort(arr, 0, arr.length - 1);
30+
31+
System.out.println("After Sorting:");
32+
printArray(arr);
33+
}
34+
35+
/**
36+
* Recursively divides the array into smaller subarrays
37+
*/
38+
public static void mergeSort(int[] arr, int left, int right) {
39+
40+
// Base condition: if single element, already sorted
41+
if (left >= right) {
42+
return;
43+
}
44+
45+
// Find middle index safely (avoids overflow)
46+
int mid = left + (right - left) / 2;
47+
48+
// Divide left half
49+
mergeSort(arr, left, mid);
50+
51+
// Divide right half
52+
mergeSort(arr, mid + 1, right);
53+
54+
// Merge sorted halves
55+
merge(arr, left, mid, right);
56+
}
57+
58+
/**
59+
* Merges two sorted subarrays into one sorted array
60+
*
61+
* Left Subarray : arr[left ... mid]
62+
* Right Subarray : arr[mid+1 ... right]
63+
*/
64+
private static void merge(int[] arr, int left, int mid, int right) {
65+
66+
// Temporary array to store merged result
67+
int[] temp = new int[right - left + 1];
68+
69+
int i = left; // Pointer for left subarray
70+
int j = mid + 1; // Pointer for right subarray
71+
int k = 0; // Pointer for temp array
72+
73+
// Compare elements from both halves
74+
while (i <= mid && j <= right) {
75+
76+
if (arr[i] <= arr[j]) {
77+
temp[k++] = arr[i++];
78+
} else {
79+
temp[k++] = arr[j++];
80+
}
81+
}
82+
83+
// Copy remaining elements from left half (if any)
84+
while (i <= mid) {
85+
temp[k++] = arr[i++];
86+
}
87+
88+
// Copy remaining elements from right half (if any)
89+
while (j <= right) {
90+
temp[k++] = arr[j++];
91+
}
92+
93+
// Copy sorted elements back to original array
94+
for (int p = 0; p < temp.length; p++) {
95+
arr[left + p] = temp[p];
96+
}
97+
}
98+
99+
/**
100+
* Utility method to print array
101+
*/
102+
private static void printArray(int[] arr) {
103+
for (int num : arr) {
104+
System.out.print(num + " ");
105+
}
106+
System.out.println();
107+
}
108+
}

0 commit comments

Comments
 (0)