質問編集履歴

2

プログラムを変更

2021/07/30 09:55

投稿

linkinpark
linkinpark

スコア42

test CHANGED
File without changes
test CHANGED
@@ -106,6 +106,144 @@
106
106
 
107
107
  }
108
108
 
109
+ プログラム追記マージソート
110
+
111
+ #include <stdio.h>
112
+
113
+ #define N 10
114
+
115
+
116
+
117
+ void merge(int *A, int nA, int *B, int nB, int i, int *C)
118
+
119
+ /* 整列配列A[0],...,A[nA-1]とB[0],...,B[nB-1]を併合し整列配列
120
+
121
+ C[i],...,C[i+nA+nB-1]に入れる */
122
+
123
+ {
124
+
125
+ int iA, iB, iC; /* iAはAの添字、iBはBの添字、iCは合計 */
126
+
127
+
128
+
129
+ iA=iB=iC=0; /* 併合の開始 */
130
+
131
+ while(iC <= nA+nB-1)
132
+
133
+ {
134
+
135
+ if(iA>=nA) {C[i+iC]=B[iB]; iB=iB+1;} /* Aは既に空 */
136
+
137
+ else
138
+
139
+ {
140
+
141
+ if(iB>=nB) {C[i+iC]=A[iA]; iA=iA+1;} /* Bは既に空 */
142
+
143
+ else /* A[iA]とB[iB]の小さい方をCへ移す */
144
+
145
+ {
146
+
147
+ if(A[iA]<=B[iB]) {C[i+iC]=A[iA]; iA=iA+1;}
148
+
149
+ else {C[i+iC]=B[iB]; iB=iB+1;}
150
+
151
+ }
152
+
153
+ }
154
+
155
+ iC=iC+1;
156
+
157
+ }
158
+
159
+ return;
160
+
161
+ }
162
+
163
+
164
+
165
+
166
+
167
+ void mergesort(int *A, int i, int j)
168
+
169
+ /* 配列A[i],...,A[j]をマージソートにより整列 */
170
+
171
+ {
172
+
173
+ int k, n, n1, n2, mid;
174
+
175
+ int A1[N], A2[N];
176
+
177
+
178
+
179
+ n=j-i+1; /* 配列のサイズ */
180
+
181
+ if(n>1)
182
+
183
+ {
184
+
185
+ mid=i+(n-1)/2; /* 中央値により前後の部分配列へ分割 */
186
+
187
+ mergesort(A, i, mid); /* 前半の整列 */
188
+
189
+ mergesort(A, mid+1, j); /* 後半の整列 */
190
+
191
+ n1=mid-i+1;
192
+
193
+ for(k=i; k<=mid; k++) A1[k-i]=A[k]; /* A1は前半の部分配列 */
194
+
195
+ n2=j-mid;
196
+
197
+ for(k=mid+1; k<=j; k++) A2[k-mid-1]=A[k]; /* A2は後半の部分配列 */
198
+
199
+ merge(A1, n1, A2, n2, i, A); /* A1とA2の併合 */
200
+
201
+ }
202
+
203
+ return;
204
+
205
+ }
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+ int main (void) {
216
+
217
+ int array[N] = { 2, 1, 8, 5, 4, 7, 9, 0, 6, 3 };
218
+
219
+ int i;
220
+
221
+
222
+
223
+ printf("print array \n");
224
+
225
+ for (i = 0; i < N; i++) { printf("%d ", array[i]); }
226
+
227
+ printf("\n");
228
+
229
+
230
+
231
+ mergesort(array, 0, N);
232
+
233
+
234
+
235
+ printf("print array \n");
236
+
237
+ for (i = 0; i < N; i++) { printf("%d ", array[i]); }
238
+
239
+ printf("\n");
240
+
241
+
242
+
243
+ return 0;
244
+
245
+ }
246
+
109
247
  ```
110
248
 
111
249
  mergeSortedDataByCatheの部分には部分的に並べ替えられたdata配列についてcacheを用いて昇順にマージソートする

1

プログラムを変更

2021/07/30 09:55

投稿

linkinpark
linkinpark

スコア42

test CHANGED
File without changes
test CHANGED
@@ -12,7 +12,15 @@
12
12
 
13
13
  void mergeSortedDataByCathe(int *data,int *cache,int first,int last,int half){
14
14
 
15
- ここの処理がわからない
15
+ int i,j,k;
16
+
17
+ for(i = first; i < half; i++) cache[i] = data[i];
18
+
19
+ for (j = last; i < last; i++) cache[i] = data[--j];
20
+
21
+ for (i--, j = first, k = first; k < last; k++)
22
+
23
+ data[k] = cache[j] < cache[i] ? cache[j++] : cache[i--];
16
24
 
17
25
  }
18
26
 
@@ -24,7 +32,7 @@
24
32
 
25
33
 
26
34
 
27
- if(first==last) return;
35
+ if(last-first<=1) return;
28
36
 
29
37
  half=(first+last)/2;
30
38
 
@@ -32,7 +40,7 @@
32
40
 
33
41
  mergeSort(data,cache,half,last);
34
42
 
35
- mergeSortedDataByCathe(data,cache,first,last,half); //マージソート
43
+ mergeSortedDataByCathe(data,cache,first,last,half);
36
44
 
37
45
  }
38
46
 
@@ -46,25 +54,25 @@
46
54
 
47
55
  if(argc!=3){
48
56
 
49
- fprintf(stderr,"Usage: %s <maxsize> <filename>\n",argv[0]); //引数が違うとリターン
57
+ fprintf(stderr,"Usage: %s <maxsize> <filename>\n",argv[0]);
50
58
 
51
59
  return 1;
52
60
 
53
61
  }
54
62
 
63
+
64
+
55
65
  maxsize=atoi(argv[1]);
56
-
57
- printf("argc=%d",argc);
58
66
 
59
67
  if((fp=fopen(argv[2],"r"))==NULL){
60
68
 
61
- fprintf(stderr,"File %s is not found\n",argv[1]);
69
+ fprintf(stderr,"File %s is not found\n",argv[2]);//標準エラー出力(printfと動きは同じ)
62
70
 
63
71
  return 1;
64
72
 
65
73
  }
66
74
 
67
- if((data=わからない)==NULL){
75
+ if((data=(int*)calloc(maxsize,sizeof(int)))==NULL){
68
76
 
69
77
  fprintf(stderr,"Out of memory\n");
70
78
 
@@ -72,7 +80,7 @@
72
80
 
73
81
  }
74
82
 
75
- if((cache=わからない)==NULL){
83
+ if((cache=(int*)calloc(maxsize,sizeof(int)))==NULL){
76
84
 
77
85
  fprintf(stderr,"Out of memory\n");
78
86
 
@@ -86,7 +94,7 @@
86
94
 
87
95
  }
88
96
 
89
- //mergeSort(data,cache,0,count);
97
+ mergeSort(data,cache,0,count);
90
98
 
91
99
  for(i=0;i<count;i++){
92
100
 
@@ -109,3 +117,5 @@
109
117
  よろしくお願いいたします。
110
118
 
111
119
  コマンドライン引数などについては多少は理解しております。
120
+
121
+ 質問のコード追記