归并排序
时间复杂度 O(N * logN)
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arrays = new int[]{3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
sort(arrays, 0, arrays.length - 1);
System.out.println(Arrays.toString(arrays));
}
public static void sort(int[] arr, int L, int R) {
if (L == R) {
return;
}
int mid = L + ((R - L) >> 1);
// 先让左边有序
sort(arr, L, mid);
// 然后让右边有序
sort(arr, mid + 1, R);
// 合并左右两部分,让整体有序
merge(arr, L, mid, R);
}
public static void merge(int[] arr, int L, int M, int R) {
int[] help = new int[R - L + 1];
int i = 0;
int p1 = L;
int p2 = M + 1;
while (p1 <= M && p2 <= R) {
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
// 上面的while结束之后,左右两部分总有一个还剩了一部分没有添加到help中
while (p1 <= M) {
help[i++] = arr[p1++];
}
while (p2 <= R) {
help[i++] = arr[p2++];
}
// 至此 arr[L, R]已经有序,将其拷贝到arr中
for (int j = L; j <= R; j++) {
arr[j] = help[j - L];
}
}
}
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
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
上次更新: 2023/11/01, 03:11:44