C shellsorting随机int数组
C shellsorting random int array
我 运行 在编写简单程序对随机数数组进行 shellsort 时遇到了问题。程序不对它进行排序,只是打印 1,1,1,1,1 或 0,0,0,0,0 即使 shellsort 算法来自 rosettacode 所以它应该是正确的。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shell_sort (int *a, int n) {
int h, i, j, t;
for (h = n; h /= 2;) {
for (i = h; i < n; i++) {
t = a[i];
for (j = i; j >= h && t < a[j - h]; j -= h) {
a[j] = a[j - h];
}
a[j] = t;
}
}
}
int main ()
{
int i;
int array[100000];
srand(time(NULL));
for (i = 0; i < 100000; i++)
{
array[i] = rand() % 1000 + 1;
}
for (i = 0; i < 5; i++)
printf("%d%\n", array[i]);
shell_sort(array, 100000);
for (i = 0; i < 5; i++)
printf("%d%\n", array[i]);
return 0;
}
你的程序在我的系统中的输出是:
94
76
444
792
967
1个
1个
1个
1个
1
另一个实例给出输出:
665
777
481
269
215
1个
1个
1个
1个
1
所以,你可以猜到生成的随机数一定有很多。
但是,如果我更改您的这段代码:
for (i = 10; i < 10005; i++)
printf("%d\n", array[i]);
shell_sort(array, 100000);
for (i = 10; i < 1005; i++)
printf("%d\n", array[i]);
输出为:
8
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
8个
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
问题不在于算法,而在于生成随机数的方式。
我只是进一步更改此行,
for (i = 0; i < 100000; i++)
{
array[i] = rand() + 1; // Removed the modulus
}
输出为:
228
228
228
229
229
229
229
229
229
230
230
230
232
232
232
233
233
234
234
236
236
236
236
237
237
237
237
237
237
238
238
238
238
239
239
239
240
240
241
241
241
241
241
242
242
242
243
244
245
245
245
245
245
245
245
246
246
248
248
248
249
249
249
249
250
250
250
250
250
250
251
251
252
253
253
253
253
253
254
254
255
256
256
257
257
257
257
259
259
260
260
261
261
261
261
262
262
262
262
263
264
264
264
265
265
265
266
266
266
266
266
266
267
267
267
267
267
267
268
268
269
269
269
269
270
270
270
270
271
272
272
272
273
273
273
274
275
275
275
275
276
276
277
277
277
277
277
277
279
279
279
279
279
280
280
280
280
280
280
280
280
280
281
281
281
281
282
282
283
283
284
284
284
285
285
285
286
286
287
287
287
287
287
288
289
289
289
289
289
290
290
291
291
292
292
292
293
293
293
294
294
294
295
295
295
295
295
296
296
297
297
298
298
298
298
298
299
299
299
299
300
300
300
300
300
301
301
303
303
303
304
304
304
305
305
305
305
306
306
307
308
308
309
310
310
310
311
311
311
311
312
312
312
313
314
314
314
314
316
316
316
316
316
316
317
317
317
317
317
317
318
319
319
319
319
320
320
321
321
321
322
322
322
322
326
326
326
326
326
327
327
327
328
328
329
329
所以,一切都很好。只是以更好的方式使用随机数。
我 运行 在编写简单程序对随机数数组进行 shellsort 时遇到了问题。程序不对它进行排序,只是打印 1,1,1,1,1 或 0,0,0,0,0 即使 shellsort 算法来自 rosettacode 所以它应该是正确的。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shell_sort (int *a, int n) {
int h, i, j, t;
for (h = n; h /= 2;) {
for (i = h; i < n; i++) {
t = a[i];
for (j = i; j >= h && t < a[j - h]; j -= h) {
a[j] = a[j - h];
}
a[j] = t;
}
}
}
int main ()
{
int i;
int array[100000];
srand(time(NULL));
for (i = 0; i < 100000; i++)
{
array[i] = rand() % 1000 + 1;
}
for (i = 0; i < 5; i++)
printf("%d%\n", array[i]);
shell_sort(array, 100000);
for (i = 0; i < 5; i++)
printf("%d%\n", array[i]);
return 0;
}
你的程序在我的系统中的输出是:
94 76 444 792 967 1个 1个 1个 1个 1
另一个实例给出输出:
665 777 481 269 215 1个 1个 1个 1个 1
所以,你可以猜到生成的随机数一定有很多。
但是,如果我更改您的这段代码:
for (i = 10; i < 10005; i++)
printf("%d\n", array[i]);
shell_sort(array, 100000);
for (i = 10; i < 1005; i++)
printf("%d\n", array[i]);
输出为:
8 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 8个 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
问题不在于算法,而在于生成随机数的方式。
我只是进一步更改此行,
for (i = 0; i < 100000; i++)
{
array[i] = rand() + 1; // Removed the modulus
}
输出为:
228 228 228 229 229 229 229 229 229 230 230 230 232 232 232 233 233 234 234 236 236 236 236 237 237 237 237 237 237 238 238 238 238 239 239 239 240 240 241 241 241 241 241 242 242 242 243 244 245 245 245 245 245 245 245 246 246 248 248 248 249 249 249 249 250 250 250 250 250 250 251 251 252 253 253 253 253 253 254 254 255 256 256 257 257 257 257 259 259 260 260 261 261 261 261 262 262 262 262 263 264 264 264 265 265 265 266 266 266 266 266 266 267 267 267 267 267 267 268 268 269 269 269 269 270 270 270 270 271 272 272 272 273 273 273 274 275 275 275 275 276 276 277 277 277 277 277 277 279 279 279 279 279 280 280 280 280 280 280 280 280 280 281 281 281 281 282 282 283 283 284 284 284 285 285 285 286 286 287 287 287 287 287 288 289 289 289 289 289 290 290 291 291 292 292 292 293 293 293 294 294 294 295 295 295 295 295 296 296 297 297 298 298 298 298 298 299 299 299 299 300 300 300 300 300 301 301 303 303 303 304 304 304 305 305 305 305 306 306 307 308 308 309 310 310 310 311 311 311 311 312 312 312 313 314 314 314 314 316 316 316 316 316 316 317 317 317 317 317 317 318 319 319 319 319 320 320 321 321 321 322 322 322 322 326 326 326 326 326 327 327 327 328 328 329 329
所以,一切都很好。只是以更好的方式使用随机数。