-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMerge.java
More file actions
71 lines (59 loc) · 1.87 KB
/
Merge.java
File metadata and controls
71 lines (59 loc) · 1.87 KB
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
64
65
66
67
68
69
70
71
public class Merge {
public static void sort(int[] input) {
// initialize
mergesort(input, 0, input.length - 1);
}
private static void mergesort(int[] list, int start, int end) {
// trivial base case
if(start >= end)
return;
// find mid index while avoiding overflows
int mid = start + ((end - start) / 2);
// sort two halves
mergesort(list, start, mid);
mergesort(list, mid + 1, end);
// merge two halves
merge(list, start, mid, end);
}
@SuppressWarnings("ManualArrayCopy")
private static void merge(int[] list, int start, int mid, int end) {
// initialize arrays
int[] left = new int[mid - start + 1];
int[] right = new int[end - mid];
for (int i = 0; i < left.length; i++) {
left[i] = list[i + start];
}
for (int i = 0; i < right.length; i++) {
right[i] = list[i + mid + 1];
}
// reuse mid and end variables for lower and upper index
// start is used to keep track of where to copy to
mid = 0; // lower
end = 0; // upper
// while both arrays have elements
while (mid < left.length && end < right.length) {
// copy the smaller one over
if (left[mid] > right[end]) {
list[start] = right[end];
end++;
} else {
list[start] = left[mid];
mid++;
}
// continue with next index
start++;
}
// left still has elements
while (mid < left.length) {
list[start] = left[mid];
start++;
mid++;
}
// right still has elements
while (end < right.length) {
list[start] = right[end];
start++;
end++;
}
}
}