-
Notifications
You must be signed in to change notification settings - Fork 522
/
Copy pathCode02_MergeSort.java
73 lines (63 loc) · 1.4 KB
/
Code02_MergeSort.java
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
72
73
package class021;
// 归并排序,填函数练习风格
// 测试链接 : https://leetcode.cn/problems/sort-an-array/
public class Code02_MergeSort {
public static int[] sortArray(int[] nums) {
if (nums.length > 1) {
// mergeSort1为递归方法
// mergeSort2为非递归方法
// 用哪个都可以
// mergeSort1(nums);
mergeSort2(nums);
}
return nums;
}
public static int MAXN = 50001;
public static int[] help = new int[MAXN];
// 归并排序递归版
public static void mergeSort1(int[] arr) {
sort(arr, 0, arr.length - 1);
}
public static void sort(int[] arr, int l, int r) {
if (l == r) {
return;
}
int m = (l + r) / 2;
sort(arr, l, m);
sort(arr, m + 1, r);
merge(arr, l, m, r);
}
// 归并排序非递归版
public static void mergeSort2(int[] arr) {
int n = arr.length;
for (int l, m, r, step = 1; step < n; step <<= 1) {
l = 0;
while (l < n) {
m = l + step - 1;
if (m + 1 >= n) {
break;
}
r = Math.min(l + (step << 1) - 1, n - 1);
merge(arr, l, m, r);
l = r + 1;
}
}
}
public static void merge(int[] arr, int l, int m, int r) {
int i = l;
int a = l;
int b = m + 1;
while (a <= m && b <= r) {
help[i++] = arr[a] <= arr[b] ? arr[a++] : arr[b++];
}
while (a <= m) {
help[i++] = arr[a++];
}
while (b <= r) {
help[i++] = arr[b++];
}
for (i = l; i <= r; i++) {
arr[i] = help[i];
}
}
}