【问题标题】:qsort() stopped sorting before array's endqsort() 在数组结束前停止排序
【发布时间】:2016-04-30 08:37:26
【问题描述】:

我有一个包含整数的文件。

我将这些值逐行读入一个数组。我正在尝试对每一行进行快速排序。在数组值完全停止打印之前,排序似乎是成功的。

我参考了:one websiteanother website 以获得指导,因为我觉得这个问题与我错误地设置了 size_t n_len = sizeof((*array)/sizeof(array)); 有关。

以下仅为相关代码:

int int_cmp(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

while ((p = fgets(line, MAX_LINE_LEN, fp)) != NULL) {

    p += strspn(p, " \t\n");
    if (*p == '#' || *p == '\0') {

        continue;
    }

    for (count = 0; *p != '\0'; ) {
        if (isdigit((unsigned char)*p)) {
            array[count++] = strtol(p, &p, 10);
        } else {

            p += strcspn(p, " \t\n");
        }

        p += strspn(p, " \t\n");
    }

    size_t n_len = sizeof((*array)/sizeof(array));
    qsort(array, n_len, sizeof(int), int_cmp);

    int n;
    for (n = 0; n < n_len; n++)
        printf("sorted array:%d\n ", array[n]);
}

这是输出:

sorted array:1
 sorted array:2
 sorted array:3
 sorted array:4

sorted array:14
 sorted array:14
 sorted array:48
 sorted array:62

sorted array:1
 sorted array:3
 sorted array:5
 sorted array:7

sorted array:123
 sorted array:456
 sorted array:789
 sorted array:1234

sorted array:34
 sorted array:34
 sorted array:34
 sorted array:34

sorted array:1

 sorted array:34
 sorted array:34
 sorted array:34

sorted array:1
 sorted array:2
 sorted array:2
 sorted array:2

输出应该是:

sorted array:1
sorted array:2
sorted array:3
sorted array:4
sorted array:4
sorted array:5
sorted array:5
sorted array:5
sorted array:6

sorted array:14
sorted array:14
sorted array:48
sorted array:62

sorted array:1
sorted array:3
sorted array:5
sorted array:7
sorted array:9

sorted array:123
sorted array:456
sorted array:789
sorted array:1234
sorted array:5678

sorted array:34
sorted array:34
sorted array:34
sorted array:34

sorted array:1
sorted array:1
sorted array:1
sorted array:2
sorted array:2
sorted array:2
sorted array:2
sorted array:2
sorted array:3
sorted array:3
sorted array:4
sorted array:4
sorted array:4
sorted array:5
sorted array:5
sorted array:6
sorted array:7
sorted array:7
sorted array:7

【问题讨论】:

  • size_t n_len = sizeof((*array)/sizeof(array)); 这可能无法提供您期望的大小。
  • 使用count 而不是n_len
  • @BLUEPIXY 谢谢!解决了。如果你想把它作为答案,我会接受。 (:

标签: c algorithm sorting quicksort


【解决方案1】:

您的数组长度表达式应该是sizeof(array) / sizeof(*array),而不是相反,加上您在sizeof((*array)/sizeof(array)) 中的括号不正确。

然而,在您的代码中,您不应该对 整个 数组进行排序,而应该只对存储从该行解析的数字的初始部分进行排序。使用这个:

    qsort(array, count, sizeof(int), int_cmp);
    printf("sorted array:");
    for (int n = 0; n < count; n++) {
        printf(" %d", array[n]);
    }
    printf("\n");

另请注意,您的 int_cmp 函数对于较大的值是不正确的:

int int_cmp(const void *a, const void *b) {
    return *(int*)a - *(int*)b;  // this may overflow
}

如果您比较 INT_MIN1,您会返回 INT_MIN - 1,它会调用未定义的行为,并且很可能有一个不正确的正值。

改用这个函数:

int int_cmp(const void *a, const void *b) {
    int na = *(int*)a, nb = *(int*)b;
    return (na < nb) - (nb < na);
}

【讨论】:

  • 另一个用户通过将 n_len 替换为 count 解决了这个问题。但是,感谢您对可能溢出的说明。我会改变它。
  • 我同意一般来说int_cmp 函数是不安全的;它将适用于示例数据。 sizeof() 表达式错误是正确的,但使用的值应该是 count(行上的整数数)而不是数组的最大大小。
  • @Justin_Finland:能否请您点击答案分数下方的灰色复选标记将其标记为已接受?
【解决方案2】:

听 BLUEPIXY 在 qsort 调用中将“n_len”参数替换为“count”。

【讨论】:

  • 我这样做了。谢谢你。 (:
【解决方案3】:

qsort() 函数将数组中元素的数量作为它的第二个参数。 只需简单地更改您的代码,它就会工作:

size_t n_len =sizeof(array)/sizeof(int);
qsort(array, n_len, sizeof(int), int_cmp);

  int n;
  for (n=0; n<n_len; n++)
     printf ("sorted array:%d\n ", array[n]);

int int_cmp (const void * a, const void * b){
  return ( *(int*)a - *(int*)b );
}

这将产生所需的答案。但我希望你知道'array'是'int'类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多