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

回答編集履歴

3

追記

2018/12/16 08:47

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -106,4 +106,122 @@
106
106
  3要素の配列でためしていますが、ご自身で、もっと要素数が多いときに常にソート結果は同じなのか、計算量の差はどのくらい異なるのかなどを調べてみることをお勧めします。
107
107
 
108
108
  [100, 99, ... 1] の配列をソートして比較すると、きっと驚くだろうと予想してます。(私は驚きました)
109
- もし実際に比較してみていただけたなら結果をコメントにでも書いてもらえれば幸いです。
109
+ もし実際に比較してみていただけたなら結果をコメントにでも書いてもらえれば幸いです。
110
+
111
+ 追記
112
+ 上のコードの quickB は質問文のものと違ってました。
113
+ 修正したコードと実行結果を示します。
114
+ ```c
115
+ #include <stdio.h>
116
+
117
+ #define swap(type, x, y) do { type t = x; x = y; y = t; swap_count++;} while (0)
118
+
119
+ int swap_count;
120
+ int call_count;
121
+
122
+ /*--- クイックソート ---*/
123
+ void quickA(int a[], int left, int right)
124
+ {
125
+ int pl = left; /* 左カーソル */
126
+ int pr = right; /* 右カーソル */
127
+ int x = a[(pl + pr) / 2]; /* 枢軸は中央の要素 */
128
+
129
+ call_count++;
130
+ do {
131
+ while (a[pl] < x) pl++;
132
+ while (a[pr] > x) pr--;
133
+ if (pl <= pr) {
134
+ swap(int, a[pl], a[pr]);
135
+ pl++;
136
+ pr--;
137
+ }
138
+ } while (pl <= pr);
139
+
140
+ if (left < pr) quickA(a, left, pr);
141
+ if (pl < right) quickA(a, pl, right);
142
+ }
143
+
144
+ void quickB(int a[], int left, int right)
145
+ {
146
+ int pl = left; /* 左カーソル */
147
+ int pr = right; /* 右カーソル */
148
+ int x = a[(pl + pr) / 2]; /* 枢軸は中央の要素 */
149
+
150
+ call_count++;
151
+ while (pl <= pr) {
152
+ while (a[pl] < x) pl++;
153
+ while (a[pr] > x) pr--;
154
+ if (pl <= pr) {
155
+ swap(int, a[pl], a[pr]);
156
+ pl++;
157
+ pr--;
158
+ };
159
+ }
160
+ if (left < pr) quickB(a, left, pr);
161
+ if (pl < right) quickB(a, pl, right);
162
+ }
163
+
164
+ void copy_to_a(int src[], int a[], int size) {
165
+ for (int i = 0; i < size; i++) {
166
+ a[i] = src[i];
167
+ }
168
+ }
169
+
170
+ void show_a(int a[], int size) {
171
+ for (int i = 0; i < size; i++) {
172
+ printf("%d ", a[i]);
173
+ }
174
+ printf(" swap_count(%d), call_count(%d)\n", swap_count, call_count);
175
+ }
176
+
177
+ int main(void) {
178
+
179
+ int test [][3] = {
180
+ {1, 2, 3},
181
+ {1, 3, 2},
182
+ {2, 1, 3},
183
+ {2, 3, 1},
184
+ {3, 1, 2},
185
+ {3, 2, 1}
186
+ };
187
+
188
+ for (int i = 0; i < 6; i++) {
189
+ int a[3];
190
+
191
+ printf("----------\n");
192
+ swap_count = call_count = 0;
193
+ show_a(test[i], 3);
194
+
195
+ copy_to_a(test[i], a, 3);
196
+ swap_count = call_count = 0;
197
+ quickA(a, 0, 2);
198
+ show_a(a, 3);
199
+
200
+ copy_to_a(test[i], a, 3);
201
+ swap_count = call_count = 0;
202
+ quickB(a, 0, 2);
203
+ show_a(a, 3);
204
+ }
205
+
206
+ int aa[100];
207
+ for (int i = 0; i < 100; i++) {
208
+ aa[i] = 100 - i;
209
+ }
210
+ swap_count = call_count = 0;
211
+ quickB(aa, 0, 99);
212
+ show_a(aa, 100);
213
+
214
+ for (int i = 0; i < 100; i++) {
215
+ aa[i] = 100 - i;
216
+ }
217
+ swap_count = call_count = 0;
218
+ quickA(aa, 0, 99);
219
+ show_a(aa, 100);
220
+
221
+
222
+ return 0;
223
+ }
224
+ ```
225
+
226
+ 実行例
227
+ ![イメージ説明](798f5c30e75bbd5364e1b5dea5e3578d.png)

2

追記

2018/12/16 08:47

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -103,4 +103,7 @@
103
103
 
104
104
  [3, 2, 1] をソートしたときに、ソート結果は同じですが、メソッドの呼び出し回数、swap の実行回数に差異があります。
105
105
 
106
- 3要素の配列でためしていますが、ご自身で、もっと要素数が多いときに常にソート結果は同じなのか、計算量の差はどのくらい異なるのかなどを調べてみることをお勧めします。
106
+ 3要素の配列でためしていますが、ご自身で、もっと要素数が多いときに常にソート結果は同じなのか、計算量の差はどのくらい異なるのかなどを調べてみることをお勧めします。
107
+
108
+ [100, 99, ... 1] の配列をソートして比較すると、きっと驚くだろうと予想してます。(私は驚きました)
109
+ もし実際に比較してみていただけたなら結果をコメントにでも書いてもらえれば幸いです。

1

追記

2018/12/16 05:52

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -101,4 +101,6 @@
101
101
  実行例
102
102
  ![イメージ説明](ae8bfa43634e7a1c9ad355c423178a5a.png)
103
103
 
104
- [3, 2, 1] をソートしたときに、ソート結果は同じですが、メソッドの呼び出し回数、swap の実行回数に差異があります。
104
+ [3, 2, 1] をソートしたときに、ソート結果は同じですが、メソッドの呼び出し回数、swap の実行回数に差異があります。
105
+
106
+ 3要素の配列でためしていますが、ご自身で、もっと要素数が多いときに常にソート結果は同じなのか、計算量の差はどのくらい異なるのかなどを調べてみることをお勧めします。