回答編集履歴

1

ちょっとコードを作ってみました。

2019/02/03 15:18

投稿

pepperleaf
pepperleaf

スコア6383

test CHANGED
@@ -21,3 +21,51 @@
21
21
 
22
22
 
23
23
  ちょっとした手直しでは無理。コメントを入れつつ、元のアルゴリズムと比べてみてください。
24
+
25
+
26
+
27
+ [作ってみた]
28
+
29
+ Wiki-pediaにあった記述を元に merge_two()を書き換えてみました。
30
+
31
+ 引数は、first: ソート対象の先頭、mid: ソート対象の中間位置、tail: 最終位置+1
32
+
33
+ 呼び出す方も併せて変更。
34
+
35
+ ```C
36
+
37
+ void merge_two(int first, int mid, int tail)
38
+
39
+ {
40
+
41
+ int i = first; // 前半部分の読み出し位置
42
+
43
+ int j = mid; // 後半部分の読み出し位置
44
+
45
+ int k = 0; // ソート結果の書き出し位置
46
+
47
+ i = first; j = mid; k = 0;
48
+
49
+ while ((i < mid) && (j < tail)) { // 前半/後半のデータがある場合
50
+
51
+ if (Merge[i] < Merge[j]) tmpmerge[k++] = Merge[i++];
52
+
53
+ else tmpmerge[k++] = Merge[j++];
54
+
55
+ }
56
+
57
+ while (i < mid) tmpmerge[k++] = Merge[i++]; // 前半部分が残った場合のみ
58
+
59
+ while (j < tail) tmpmerge[k++] = Merge[j++]; // 後半部分が残った場合のみ
60
+
61
+ i = first; k = 0;
62
+
63
+ while (i < tail) Merge[i++] = tmpmerge[k++]; // Merge[]配列に書き戻し
64
+
65
+ }
66
+
67
+ ```
68
+
69
+
70
+
71
+ 元コードと様相は変わってしまいましたが、参考までに。