回答編集履歴

2

diff のコードを追加

2021/09/28 15:56

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -43,6 +43,12 @@
43
43
  + for (int i = 0; i < high - low + 1; i++) {
44
44
 
45
45
  + a[low + i] = z[i];
46
+
47
+
48
+
49
+ - mergesort(0, a.length - 1);
50
+
51
+ + mergesort(a, 0, a.length - 1);
46
52
 
47
53
  ```
48
54
 

1

追記

2021/09/28 15:56

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -1,3 +1,117 @@
1
1
  mergesort は配列 a の low から high までをソートするんですよね。
2
2
 
3
3
  a の一部を x や y にコピーしても、それらをソートすることはできません。
4
+
5
+
6
+
7
+ **追記**
8
+
9
+ a や x や y など、複数の配列をソートしたいのなら、
10
+
11
+ mergesort にそれらを引数で渡す必要があります。
12
+
13
+ 次の修正が必要です。
14
+
15
+ ```diff
16
+
17
+ - private void mergesort(int low, int high) {
18
+
19
+ + private void mergesort(int[] a, int low, int high) {
20
+
21
+ int xSize = (high - low + 1) / 2;
22
+
23
+ - int ySize = (high + 1) - xSize;
24
+
25
+ + int ySize = (high - low + 1) - xSize;
26
+
27
+
28
+
29
+ - mergesort(0, xSize - 1);
30
+
31
+ - mergesort(0, ySize - 1);
32
+
33
+ + mergesort(x, 0, xSize - 1);
34
+
35
+ + mergesort(y, 0, ySize - 1);
36
+
37
+
38
+
39
+ - for (int i = 0; i < n; i++) {
40
+
41
+ - a[i] = z[i];
42
+
43
+ + for (int i = 0; i < high - low + 1; i++) {
44
+
45
+ + a[low + i] = z[i];
46
+
47
+ ```
48
+
49
+ ySize の求め方を間違っていますし、z から a に戻すところも間違っています。
50
+
51
+
52
+
53
+ x や y を使わないで書くなら、
54
+
55
+ ```java
56
+
57
+ public class Main {
58
+
59
+ private int[] a = { 3, 2, 8, 4, 5, 7, 1, 0, 6, 9 };
60
+
61
+ private int[] z = new int[a.length];
62
+
63
+
64
+
65
+ private void mergesort(int low, int high) {
66
+
67
+ int n = high - low + 1;
68
+
69
+ if (n <= 1) return;
70
+
71
+ int mid = low + n/2;
72
+
73
+ mergesort(low, mid - 1);
74
+
75
+ mergesort(mid, high);
76
+
77
+ int i, j, k;
78
+
79
+ for (i = low; i < mid; i++) z[i] = a[i];
80
+
81
+ for (j = high; i <= high; i++) z[j--] = a[i];
82
+
83
+ for (k = i = low, j = high; k <= high; k++)
84
+
85
+ a[k] = z[i] < z[j] ? z[i++] : z[j--];
86
+
87
+ }
88
+
89
+
90
+
91
+ public void sort() {
92
+
93
+ mergesort(0, a.length - 1);
94
+
95
+ for (int i = 0; i < a.length; i++)
96
+
97
+ System.out.print(" " + a[i]);
98
+
99
+ System.out.println();
100
+
101
+ }
102
+
103
+
104
+
105
+ public static void main(String[] args) {
106
+
107
+ new Main().sort();
108
+
109
+ }
110
+
111
+ }
112
+
113
+ ```
114
+
115
+ mergesort は再帰的に何度も呼び出されるので、毎回 z を new するのは非効率です。
116
+
117
+ 一度だけ new して、それを使えば問題ありません。