回答編集履歴

2

Integer.compare を使ったコードを追加

2021/07/15 11:03

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -67,3 +67,41 @@
67
67
  という状態にしておいて、for文の中で、一度でも逆順が見つかったら、
68
68
 
69
69
  `a = true;` で「逆順があった」とするんです。
70
+
71
+
72
+
73
+ **追記2**
74
+
75
+ 質問のコードで、昇順と降順でほぼ同じコードが 2つ書かれているのが気になります。
76
+
77
+ Integer.compare を使えば、次のように 1つにできます。
78
+
79
+ ```Java
80
+
81
+ public static void arraySort(int[] array, boolean orderType) {
82
+
83
+ int diff = orderType ? 1 : -1; // 比較結果
84
+
85
+ boolean rev; // 逆順検出フラグ
86
+
87
+ do {
88
+
89
+ rev = false; // 逆順無しと仮定
90
+
91
+ for (int i = 1 ; i < array.length; i++) {
92
+
93
+ if (Integer.compare(array[i-1], array[i]) == diff) {
94
+
95
+ rev = true; // 逆順検出
96
+
97
+ change(array, i-1, i);
98
+
99
+ }
100
+
101
+ }
102
+
103
+ } while (rev); // 逆順有りならループ
104
+
105
+ }
106
+
107
+ ```

1

説明の追加

2021/07/15 11:03

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -7,3 +7,63 @@
7
7
  紙に「array: 96 45 31 29 84 77」と書いて、コードを順に追っていくと、
8
8
 
9
9
  array の値と変数 a と i の値がどう変化するのかを全部書いてみてください。
10
+
11
+
12
+
13
+ **追記**
14
+
15
+ 質問の仕方が間違っています。
16
+
17
+ 何が分からないのかを全く書いていません。
18
+
19
+ 発生している問題が「順番に並び変わっていません。」で、
20
+
21
+ あとはコードがあるだけです。
22
+
23
+
24
+
25
+ 「`a = false;` を for文の前に置いてください」と回答しようかと思ったんですが、
26
+
27
+ そうすると、意味も考えず、「解決しました。ありがとうございます」というコメントが
28
+
29
+ 返ってきて終了することが多いので今回はそのような回答をしませんでした。
30
+
31
+
32
+
33
+ > `a = false;` を `while (a) {` のすぐ後に置いたら正しい結果が出るのに、
34
+
35
+ `for(int i=0 ; i<array.length-1 ; i++) {` のすぐ後に置いたら
36
+
37
+ 正しい結果が出ないのはなぜですか?
38
+
39
+
40
+
41
+ という疑問なら、質問にそう書くべきなんです。
42
+
43
+
44
+
45
+ そうすると、次のような回答を書きます。
46
+
47
+
48
+
49
+ 質問のコードでは、`a = false;` が for文の中にあります。
50
+
51
+ 配列の**要素ごと**に、逆順が見つかったかどうかが a に入ります。
52
+
53
+ for文が終了した時、a に入ったのは、最後の比較の結果だけです。
54
+
55
+ それ以前の比較の結果は全部無視されます。
56
+
57
+
58
+
59
+ やりたいことは、配列を順番に見ていって、一度でも逆順を見つけたら
60
+
61
+ まだソートが完了していない可能性があるということを a に記録することです。
62
+
63
+
64
+
65
+ だから、for文の前に `a = false;` を置いて、逆順はまだ見つかっていない
66
+
67
+ という状態にしておいて、for文の中で、一度でも逆順が見つかったら、
68
+
69
+ `a = true;` で「逆順があった」とするんです。