|
16 | 16 |
|
17 | 17 | public class Code_0014_MergeSort {
|
18 | 18 |
|
| 19 | + // merge sort的递归写法 |
| 20 | + public static void sort(int[] arr) { |
| 21 | + mergeSort(arr, 0, arr.length - 1); |
| 22 | + } |
| 23 | + |
19 | 24 | // 递归解法
|
20 | | - public static void mergeSort1(int[] arr, int l, int r) { |
| 25 | + public static void mergeSort(int[] arr, int l, int r) { |
21 | 26 | if (l >= r) {
|
22 | 27 | // 终止条件
|
23 | 28 | return;
|
24 | 29 | }
|
25 | | - int m = l + ((r - l) >> 1); // 中点位置 |
26 | | - mergeSort1(arr, l, m); |
27 | | - mergeSort1(arr, m + 1, r); |
28 | | - merge(arr, l, m, r); |
| 30 | + int mid = l + ((r - l) >> 1); |
| 31 | + mergeSort(arr, l, mid); |
| 32 | + mergeSort(arr, mid + 1, r); |
| 33 | + merge2(arr, l, mid, r); |
| 34 | + } |
| 35 | + |
| 36 | + public static void merge2(int[] arr, int l, int m, int r) { |
| 37 | + int[] help = new int[r - l + 1]; |
| 38 | + int s = l; |
| 39 | + int e = m + 1; |
| 40 | + int i = 0; |
| 41 | + while (s <= m && e <= r) { |
| 42 | + if (arr[s] <= arr[e]) { |
| 43 | + help[i++] = arr[s++]; |
| 44 | + } else { |
| 45 | + help[i++] = arr[e++]; |
| 46 | + } |
| 47 | + } |
| 48 | + while (s <= m) { |
| 49 | + help[i++] = arr[s++]; |
| 50 | + } |
| 51 | + while (e <= r) { |
| 52 | + help[i++] = arr[e++]; |
| 53 | + } |
| 54 | + for (i = 0; i < help.length; i++) { |
| 55 | + arr[l++] = help[i]; |
| 56 | + } |
29 | 57 | }
|
30 | 58 |
|
31 | 59 | // 迭代版本的merge sort
|
@@ -117,7 +145,7 @@ public static void main(String[] args) {
|
117 | 145 | int[] copyArray1 = copyArray(arr);
|
118 | 146 | int[] copyArray2 = copyArray(arr);
|
119 | 147 | Arrays.sort(arr);
|
120 | | - mergeSort1(copyArray1, 0, copyArray1.length - 1); |
| 148 | + sort(copyArray1); |
121 | 149 | mergeSort2(copyArray2, 0, copyArray2.length - 1);
|
122 | 150 | if (!sameValue(arr, copyArray1)) {
|
123 | 151 | System.out.println("出错了!");
|
|
0 commit comments