回答編集履歴

1

コードの改善

2021/07/01 00:30

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -37,3 +37,75 @@
37
37
  i > mid の場合、l から mid までの配列要素は全部 tmp に入れてしまったということです。
38
38
 
39
39
  したがって、nums[i] > nums[j] の比較をせずに tmp に nums[j] を入れてよいということです。
40
+
41
+
42
+
43
+ **追記**
44
+
45
+ tmp を何度も new するのは無駄だし、
46
+
47
+ merge の wihleループで、`i <= mid`、`j <= r`、`i > mid`、`j <= r` の
48
+
49
+ 比較を行うのも効率が悪いので書き直してみました。
50
+
51
+ ```Java
52
+
53
+ class Solution {
54
+
55
+ int[] tmp;
56
+
57
+
58
+
59
+ public void sortArray(int[] nums) {
60
+
61
+ tmp = new int[nums.length];
62
+
63
+ mergeSort(nums, 0, nums.length - 1);
64
+
65
+ }
66
+
67
+ private void mergeSort(int[] nums, int l, int r) {
68
+
69
+ if (l >= r) return;
70
+
71
+ int mid = l + (r - l) / 2;
72
+
73
+ mergeSort(nums, l, mid);
74
+
75
+ mergeSort(nums, mid + 1, r);
76
+
77
+ merge(nums, l, mid, r);
78
+
79
+ }
80
+
81
+ private void merge(int[] nums, int l, int mid, int r) {
82
+
83
+ System.arraycopy(nums, l, tmp, l, mid - l + 1);
84
+
85
+ for (int i = mid + 1, k = r; i <= r; )
86
+
87
+ tmp[k--] = nums[i++];
88
+
89
+ for (int i = l, j = r, k = l; i <= j; )
90
+
91
+ nums[k++] = tmp[i] < tmp[j] ? tmp[i++] : tmp[j--];
92
+
93
+ }
94
+
95
+
96
+
97
+ public static void main(String[] args) {
98
+
99
+ int[] nums = { 5, 1, 1, 2, 0, 0 };
100
+
101
+ Solution sol = new Solution();
102
+
103
+ sol.sortArray(nums);
104
+
105
+ System.out.println(java.util.Arrays.toString(nums));
106
+
107
+ }
108
+
109
+ }
110
+
111
+ ```