关于shell排序:C shell排序随机int数组

C shellsorting random int array

我在将简单程序写入ShellSort随机数数组时遇到了一个问题。程序不排序,只打印1,1,1,1,1或0,0,0,0,0,0,即使ShellSort算法来自Rosettacode,所以它应该是正确的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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%
"
, array[i]);

    shell_sort(array, 100000);

    for (i = 0; i < 5; i++)
        printf("%d%
"
, array[i]);

    return 0;
}


您在我的系统中的程序输出是:

九十四七十六四百四十四七百九十二九百六十七一一一一一

另一个实例提供输出:

六百六十五七百七十七四百八十一二百六十九二百一十五一一一一一

所以,你可以猜测生成的随机数一定有很多。

但是,如果我更改了这段代码:

1
2
3
4
5
6
7
8
9
for (i = 10; i < 10005; i++)
    printf("%d
"
, array[i]);

shell_sort(array, 100000);

for (i = 10; i < 1005; i++)
    printf("%d
"
, array[i]);

输出为:

八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八八九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十

问题不在于算法,而在于生成随机数的方式。

我只是把这条线再改一下,

1
2
3
4
 for (i = 0; i < 100000; i++)
    {
        array[i] = rand() + 1;  // Removed the modulus
    }

输出为:

二百二十八二百二十八二百二十八二百二十九二百二十九二百二十九二百二十九二百二十九二百二十九二百三十二百三十二百三十二百三十二二百三十二二百三十二二百三十三二百三十三二百三十四二百三十四二百三十六二百三十六二百三十六二百三十六二百三十七二百三十七二百三十七二百三十七二百三十七二百三十七二百三十八二百三十八二百三十八二百三十八二百三十九二百三十九二百三十九二百四十二百四十二百四十一二百四十一二百四十一二百四十一二百四十一二百四十二二百四十二二百四十二二百四十三二百四十四二百四十五二百四十五二百四十五二百四十五二百四十五二百四十五二百四十五二百四十六二百四十六二百四十八二百四十八二百四十八二百四十九二百四十九二百四十九二百四十九二百五十二百五十二百五十二百五十二百五十二百五十二百五十一二百五十一二百五十二二百五十三二百五十三二百五十三二百五十三二百五十三二百五十四二百五十四二百五十五二百五十六二百五十六二百五十七二百五十七二百五十七二百五十七二百五十九二百五十九二百六十二百六十二百六十一二百六十一二百六十一二百六十一二百六十二二百六十二二百六十二二百六十二二百六十三二百六十四二百六十四二百六十四二百六十五二百六十五二百六十五二百六十六二百六十六二百六十六二百六十六二百六十六二百六十六二百六十七二百六十七二百六十七二百六十七二百六十七二百六十七二百六十八二百六十八二百六十九二百六十九二百六十九二百六十九二百七十二百七十二百七十二百七十二百七十一二百七十二二百七十二二百七十二二百七十三二百七十三二百七十三二百七十四二百七十五二百七十五二百七十五二百七十五二百七十六二百七十六二百七十七二百七十七二百七十七二百七十七二百七十七二百七十七二百七十九二百七十九二百七十九二百七十九二百七十九二百八十二百八十二百八十二百八十二百八十二百八十二百八十二百八十二百八十二百八十一二百八十一二百八十一二百八十一二百八十二二百八十二二百八十三二百八十三二百八十四二百八十四二百八十四二百八十五二百八十五二百八十五二百八十六二百八十六二百八十七二百八十七二百八十七二百八十七二百八十七二百八十八二百八十九二百八十九二百八十九二百八十九二百八十九二百九十二百九十二百九十一二百九十一二百九十二二百九十二二百九十二二百九十三二百九十三二百九十三二百九十四二百九十四二百九十四二百九十五二百九十五二百九十五二百九十五二百九十五二百九十六二百九十六二百九十七二百九十七二百九十八二百九十八二百九十八二百九十八二百九十八二百九十九二百九十九二百九十九二百九十九三百三百三百三百三百三百零一三百零一三百零三三百零三三百零三三百零四三百零四三百零四三百零五三百零五三百零五三百零五三百零六三百零六三百零七三百零八三百零八三百零九三百一十三百一十三百一十三百一十一三百一十一三百一十一三百一十一三百一十二三百一十二三百一十二三百一十三三百一十四三百一十四三百一十四三百一十四三百一十六三百一十六三百一十六三百一十六三百一十六三百一十六三百一十七三百一十七三百一十七三百一十七三百一十七三百一十七三百一十八三百一十九三百一十九三百一十九三百一十九三百二十三百二十三百二十一三百二十一三百二十一三百二十二三百二十二三百二十二三百二十二三百二十六三百二十六三百二十六三百二十六三百二十六三百二十七三百二十七三百二十七三百二十八三百二十八三百二十九三百二十九

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