回答編集履歴

3

追記

2018/12/16 08:47

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -215,3 +215,239 @@
215
215
  [100, 99, ... 1] の配列をソートして比較すると、きっと驚くだろうと予想してます。(私は驚きました)
216
216
 
217
217
  もし実際に比較してみていただけたなら結果をコメントにでも書いてもらえれば幸いです。
218
+
219
+
220
+
221
+ 追記
222
+
223
+ 上のコードの quickB は質問文のものと違ってました。
224
+
225
+ 修正したコードと実行結果を示します。
226
+
227
+ ```c
228
+
229
+ #include <stdio.h>
230
+
231
+
232
+
233
+ #define swap(type, x, y) do { type t = x; x = y; y = t; swap_count++;} while (0)
234
+
235
+
236
+
237
+ int swap_count;
238
+
239
+ int call_count;
240
+
241
+
242
+
243
+ /*--- クイックソート ---*/
244
+
245
+ void quickA(int a[], int left, int right)
246
+
247
+ {
248
+
249
+ int pl = left; /* 左カーソル */
250
+
251
+ int pr = right; /* 右カーソル */
252
+
253
+ int x = a[(pl + pr) / 2]; /* 枢軸は中央の要素 */
254
+
255
+
256
+
257
+ call_count++;
258
+
259
+ do {
260
+
261
+ while (a[pl] < x) pl++;
262
+
263
+ while (a[pr] > x) pr--;
264
+
265
+ if (pl <= pr) {
266
+
267
+ swap(int, a[pl], a[pr]);
268
+
269
+ pl++;
270
+
271
+ pr--;
272
+
273
+ }
274
+
275
+ } while (pl <= pr);
276
+
277
+
278
+
279
+ if (left < pr) quickA(a, left, pr);
280
+
281
+ if (pl < right) quickA(a, pl, right);
282
+
283
+ }
284
+
285
+
286
+
287
+ void quickB(int a[], int left, int right)
288
+
289
+ {
290
+
291
+ int pl = left; /* 左カーソル */
292
+
293
+ int pr = right; /* 右カーソル */
294
+
295
+ int x = a[(pl + pr) / 2]; /* 枢軸は中央の要素 */
296
+
297
+
298
+
299
+ call_count++;
300
+
301
+ while (pl <= pr) {
302
+
303
+ while (a[pl] < x) pl++;
304
+
305
+ while (a[pr] > x) pr--;
306
+
307
+ if (pl <= pr) {
308
+
309
+ swap(int, a[pl], a[pr]);
310
+
311
+ pl++;
312
+
313
+ pr--;
314
+
315
+ };
316
+
317
+ }
318
+
319
+ if (left < pr) quickB(a, left, pr);
320
+
321
+ if (pl < right) quickB(a, pl, right);
322
+
323
+ }
324
+
325
+
326
+
327
+ void copy_to_a(int src[], int a[], int size) {
328
+
329
+ for (int i = 0; i < size; i++) {
330
+
331
+ a[i] = src[i];
332
+
333
+ }
334
+
335
+ }
336
+
337
+
338
+
339
+ void show_a(int a[], int size) {
340
+
341
+ for (int i = 0; i < size; i++) {
342
+
343
+ printf("%d ", a[i]);
344
+
345
+ }
346
+
347
+ printf(" swap_count(%d), call_count(%d)\n", swap_count, call_count);
348
+
349
+ }
350
+
351
+
352
+
353
+ int main(void) {
354
+
355
+
356
+
357
+ int test [][3] = {
358
+
359
+ {1, 2, 3},
360
+
361
+ {1, 3, 2},
362
+
363
+ {2, 1, 3},
364
+
365
+ {2, 3, 1},
366
+
367
+ {3, 1, 2},
368
+
369
+ {3, 2, 1}
370
+
371
+ };
372
+
373
+
374
+
375
+ for (int i = 0; i < 6; i++) {
376
+
377
+ int a[3];
378
+
379
+
380
+
381
+ printf("----------\n");
382
+
383
+ swap_count = call_count = 0;
384
+
385
+ show_a(test[i], 3);
386
+
387
+
388
+
389
+ copy_to_a(test[i], a, 3);
390
+
391
+ swap_count = call_count = 0;
392
+
393
+ quickA(a, 0, 2);
394
+
395
+ show_a(a, 3);
396
+
397
+
398
+
399
+ copy_to_a(test[i], a, 3);
400
+
401
+ swap_count = call_count = 0;
402
+
403
+ quickB(a, 0, 2);
404
+
405
+ show_a(a, 3);
406
+
407
+ }
408
+
409
+
410
+
411
+ int aa[100];
412
+
413
+ for (int i = 0; i < 100; i++) {
414
+
415
+ aa[i] = 100 - i;
416
+
417
+ }
418
+
419
+ swap_count = call_count = 0;
420
+
421
+ quickB(aa, 0, 99);
422
+
423
+ show_a(aa, 100);
424
+
425
+
426
+
427
+ for (int i = 0; i < 100; i++) {
428
+
429
+ aa[i] = 100 - i;
430
+
431
+ }
432
+
433
+ swap_count = call_count = 0;
434
+
435
+ quickA(aa, 0, 99);
436
+
437
+ show_a(aa, 100);
438
+
439
+
440
+
441
+
442
+
443
+ return 0;
444
+
445
+ }
446
+
447
+ ```
448
+
449
+
450
+
451
+ 実行例
452
+
453
+ ![イメージ説明](798f5c30e75bbd5364e1b5dea5e3578d.png)

2

追記

2018/12/16 08:47

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -209,3 +209,9 @@
209
209
 
210
210
 
211
211
  3要素の配列でためしていますが、ご自身で、もっと要素数が多いときに常にソート結果は同じなのか、計算量の差はどのくらい異なるのかなどを調べてみることをお勧めします。
212
+
213
+
214
+
215
+ [100, 99, ... 1] の配列をソートして比較すると、きっと驚くだろうと予想してます。(私は驚きました)
216
+
217
+ もし実際に比較してみていただけたなら結果をコメントにでも書いてもらえれば幸いです。

1

追記

2018/12/16 05:52

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -205,3 +205,7 @@
205
205
 
206
206
 
207
207
  [3, 2, 1] をソートしたときに、ソート結果は同じですが、メソッドの呼び出し回数、swap の実行回数に差異があります。
208
+
209
+
210
+
211
+ 3要素の配列でためしていますが、ご自身で、もっと要素数が多いときに常にソート結果は同じなのか、計算量の差はどのくらい異なるのかなどを調べてみることをお勧めします。