23
23
24
24
package com .abranhe .allalgorithms .sorting ;
25
25
26
+ import java .util .Arrays ;
27
+
26
28
/**
27
29
* The class {@code MergeSort} contains methods for performing
28
30
* a poor :( merge sort algorithm of Integers and Doubles
29
31
*
30
32
* @author Carlos Abraham Hernandez
33
+ * @author Brandon Gastelo
31
34
* @since 0.0.1
32
35
*/
33
36
public class MergeSort {
@@ -138,6 +141,51 @@ private static void merge(double arr[], int l, int m, int r) {
138
141
k ++;
139
142
}
140
143
}
144
+
145
+ /**
146
+ * Merges two subarrays of arr[]. generic type
147
+ * First subarray is arr[l..m]
148
+ * Second subarray is arr[m+1..r]
149
+ *
150
+ * @param arr array
151
+ * @param l index to start sorting
152
+ * @param m index of the middle of the array
153
+ * @param r index to finish sorting
154
+ */
155
+ private static <T extends Comparable <? super T >> void merge (T arr [], int l , int m , int r ) {
156
+ int n1 = m - l + 1 ;
157
+ int n2 = r - m ;
158
+
159
+ T L [] = Arrays .copyOfRange (arr , l , l +n1 );
160
+ T R [] = Arrays .copyOfRange (arr , m +1 , r +1 );
161
+
162
+ int i = 0 , j = 0 ;
163
+
164
+ int k = l ;
165
+ while (i < n1 && j < n2 ) {
166
+ if (L [i ].compareTo (R [j ]) <= 0 ) {
167
+ arr [k ] = L [i ];
168
+ i ++;
169
+ }
170
+ else {
171
+ arr [k ] = R [j ];
172
+ j ++;
173
+ }
174
+ k ++;
175
+ }
176
+
177
+ while (i < n1 ) {
178
+ arr [k ] = L [i ];
179
+ i ++;
180
+ k ++;
181
+ }
182
+
183
+ while (j < n2 ) {
184
+ arr [k ] = R [j ];
185
+ j ++;
186
+ k ++;
187
+ }
188
+ }
141
189
142
190
/**
143
191
* Sort array of integers
@@ -174,7 +222,24 @@ private static void sort(double arr[], int l, int r) {
174
222
merge (arr , l , m , r );
175
223
}
176
224
}
225
+
226
+ /**
227
+ * Sort array of generic objects
228
+ * @param arr array
229
+ * @param l index to start sorting
230
+ * @param r index to finish sorting
231
+ */
232
+ private static <T extends Comparable <? super T >> void sort (T [] arr , int l , int r ) {
233
+ if (l < r ) {
234
+ int m = (l +r )/2 ;
235
+
236
+ sort (arr , l , m );
237
+ sort (arr , m +1 , r );
177
238
239
+ merge (arr , l , m , r );
240
+ }
241
+ }
242
+
178
243
/**
179
244
* The sort method of the {@code MergeSort} class
180
245
* takes an array of {@code Integers} an sort it.
@@ -198,4 +263,17 @@ public static void sort(double arr[]) {
198
263
int r = arr .length -1 ;
199
264
sort (arr , l , r );
200
265
}
266
+
267
+ /**
268
+ * The sort method of the {@code MergeSort} class
269
+ * takes an array of {@code Comparable} objects
270
+ * and sorts them.
271
+ *
272
+ * @param arr array of objects to be sorted
273
+ */
274
+ public static <T extends Comparable <? super T >> void sort (T arr []) {
275
+ int l = 0 ;
276
+ int r = arr .length -1 ;
277
+ sort (arr , l , r );
278
+ }
201
279
}
0 commit comments