1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| import java.util.Arrays; import java.util.Comparator;
public class MergeSort {
public static <T> void sort(T[] data, Comparator<T> comparator) { sort(data, comparator, 0, data.length - 1); }
private static <T> void sort(T[] data, Comparator<T> comparator, int left, int right) { if (left >= right) { return; } int mid = (left + right) >>> 1; sort(data, comparator, left, mid); sort(data, comparator, mid + 1, right); if (comparator.compare(data[mid], data[mid + 1]) > 0) { merge(data, comparator, left, mid, right); } }
private static <T> void merge(T[] data, Comparator<T> comparator, int left, int mid, int right) { T[] aux = Arrays.copyOfRange(data, left, right + 1); int i = left; int j = mid + 1; for (int k = left; k <= right; k++) { if (i > mid) { data[k] = aux[j - left]; j++; } else if (j > right) { data[k] = aux[i - left]; i++; } else if (comparator.compare(aux[i - left], aux[j - left]) < 0) { data[k] = aux[i - left]; i++; } else { data[k] = aux[j - left]; j++; } } }
public static void main(String[] args) { Integer[] data = {3, 1, 2, 5, 4}; sort(data, Integer::compareTo); System.out.println(Arrays.toString(data)); }
}
|