Skip to content

Commit 344a27b

Browse files
committed
Add support for using merge sort on generic objects implementing the Comparable interface.
1 parent b518e10 commit 344a27b

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

src/main/java/com/abranhe/allalgorithms/sorting/MergeSort.java

+78
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@
2323

2424
package com.abranhe.allalgorithms.sorting;
2525

26+
import java.util.Arrays;
27+
2628
/**
2729
* The class {@code MergeSort} contains methods for performing
2830
* a poor :( merge sort algorithm of Integers and Doubles
2931
*
3032
* @author Carlos Abraham Hernandez
33+
* @author Brandon Gastelo
3134
* @since 0.0.1
3235
*/
3336
public class MergeSort {
@@ -138,6 +141,51 @@ private static void merge(double arr[], int l, int m, int r) {
138141
k++;
139142
}
140143
}
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+
}
141189

142190
/**
143191
* Sort array of integers
@@ -174,7 +222,24 @@ private static void sort(double arr[], int l, int r) {
174222
merge(arr, l, m, r);
175223
}
176224
}
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);
177238

239+
merge(arr, l, m, r);
240+
}
241+
}
242+
178243
/**
179244
* The sort method of the {@code MergeSort} class
180245
* takes an array of {@code Integers} an sort it.
@@ -198,4 +263,17 @@ public static void sort(double arr[]) {
198263
int r = arr.length-1;
199264
sort(arr, l, r);
200265
}
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+
}
201279
}

0 commit comments

Comments
 (0)