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