teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

diff のコードを追加

2021/09/28 15:56

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -21,6 +21,9 @@
21
21
  - a[i] = z[i];
22
22
  + for (int i = 0; i < high - low + 1; i++) {
23
23
  + a[low + i] = z[i];
24
+
25
+ - mergesort(0, a.length - 1);
26
+ + mergesort(a, 0, a.length - 1);
24
27
  ```
25
28
  ySize の求め方を間違っていますし、z から a に戻すところも間違っています。
26
29
 

1

追記

2021/09/28 15:56

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -1,2 +1,59 @@
1
1
  mergesort は配列 a の low から high までをソートするんですよね。
2
- a の一部を x や y にコピーしても、それらをソートすることはできません。
2
+ a の一部を x や y にコピーしても、それらをソートすることはできません。
3
+
4
+ **追記**
5
+ a や x や y など、複数の配列をソートしたいのなら、
6
+ mergesort にそれらを引数で渡す必要があります。
7
+ 次の修正が必要です。
8
+ ```diff
9
+ - private void mergesort(int low, int high) {
10
+ + private void mergesort(int[] a, int low, int high) {
11
+ int xSize = (high - low + 1) / 2;
12
+ - int ySize = (high + 1) - xSize;
13
+ + int ySize = (high - low + 1) - xSize;
14
+
15
+ - mergesort(0, xSize - 1);
16
+ - mergesort(0, ySize - 1);
17
+ + mergesort(x, 0, xSize - 1);
18
+ + mergesort(y, 0, ySize - 1);
19
+
20
+ - for (int i = 0; i < n; i++) {
21
+ - a[i] = z[i];
22
+ + for (int i = 0; i < high - low + 1; i++) {
23
+ + a[low + i] = z[i];
24
+ ```
25
+ ySize の求め方を間違っていますし、z から a に戻すところも間違っています。
26
+
27
+ x や y を使わないで書くなら、
28
+ ```java
29
+ public class Main {
30
+ private int[] a = { 3, 2, 8, 4, 5, 7, 1, 0, 6, 9 };
31
+ private int[] z = new int[a.length];
32
+
33
+ private void mergesort(int low, int high) {
34
+ int n = high - low + 1;
35
+ if (n <= 1) return;
36
+ int mid = low + n/2;
37
+ mergesort(low, mid - 1);
38
+ mergesort(mid, high);
39
+ int i, j, k;
40
+ for (i = low; i < mid; i++) z[i] = a[i];
41
+ for (j = high; i <= high; i++) z[j--] = a[i];
42
+ for (k = i = low, j = high; k <= high; k++)
43
+ a[k] = z[i] < z[j] ? z[i++] : z[j--];
44
+ }
45
+
46
+ public void sort() {
47
+ mergesort(0, a.length - 1);
48
+ for (int i = 0; i < a.length; i++)
49
+ System.out.print(" " + a[i]);
50
+ System.out.println();
51
+ }
52
+
53
+ public static void main(String[] args) {
54
+ new Main().sort();
55
+ }
56
+ }
57
+ ```
58
+ mergesort は再帰的に何度も呼び出されるので、毎回 z を new するのは非効率です。
59
+ 一度だけ new して、それを使えば問題ありません。