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

所以,一切都很好。只是以更好的方式使用随机数。