1 import java.util.*;
2
3 /**
4
5 */
6 public class MergeSorter
7 {
8 /**
9
10 @param a
11 @param comp
12 */
13 public static <E> void sort(E[] a, Comparator<? super E> comp)
14 {
15 mergeSort(a, 0, a.length - 1, comp);
16 }
17
18 /**
19
20
21 @param a
22 @param from
23 @param to
24 @param comp
25 */
26 private static <E> void mergeSort(E[] a, int from, int to,
27 Comparator<? super E> comp)
28 {
29 if (from == to) return;
30 int mid = (from + to) / 2;
31 //
32 mergeSort(a, from, mid, comp);
33 mergeSort(a, mid + 1, to, comp);
34 merge(a, from, mid, to, comp);
35 }
36
37 /**
38
39 @param a
40 @param from
41
42 @param mid
43
44 @param to
45
46 @param comp
47 */
48 private static <E> void merge(E[] a,
49 int from, int mid, int to, Comparator<? super E> comp)
50 {
51 int n = to - from + 1;
52 //
53
54 //
55 Object[] b = new Object[n];
56
57 int i1 = from;
58 //
59 int i2 = mid + 1;
60 //
61 int j = 0;
62 //
63
64 //
65 //
66 while (i1 <= mid && i2 <= to)
67 {
68 if (comp.compare(a[i1], a[i2]) < 0)
69 {
70 b[j] = a[i1];
71 i1++;
72 }
73 else
74 {
75 b[j] = a[i2];
76 i2++;
77 }
78 j++;
79 }
80
81 //
82 //
83
84 //
85 while (i1 <= mid)
86 {
87 b[j] = a[i1];
88 i1++;
89 j++;
90 }
91
92 //
93 while (i2 <= to)
94 {
95 b[j] = a[i2];
96 i2++;
97 j++;
98 }
99
100 //
101 for (j = 0; j < n; j++)
102 a[from + j] = (E) b[j];
103 }
104 }