C qsort 无法正常工作

标签 c qsort

我不知道我做错了什么,但下面的代码没有正确排序数组。

#include <stdio.h>
#include <stdlib.h>

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

int main()
{
    int x[] = { -919238029,
            -889150029,
            -826670576,
            -579609061,
            -569653113,
            -305140505,
            -216823425,
            -193439331,
            -167683147,
            -49487019,
            -45223520,
            271789961,
            275570429,
            444855014,
            559132135,
            612312607,
            664554739,
            677860351,
            1005278191,
            1031629361,
            1089012280,
            1115952521,
            1521112993,
            1530518916,
            1907515865,
            1931470931,
            -1631034645,
            -1593702794,
            -1465300620,
            -1263094822
         };
    int i;

    qsort(x, 30, sizeof(int), compare);
    for(i = 0; i < 30; i ++)
        printf("%d\n", x[i]);

    return 0;
}

产生以下输出:

1521112993
1530518916
1907515865
1931470931
-1631034645
-1593702794
-1465300620
-1263094822
-919238029
-889150029
-826670576
-579609061
-569653113
-305140505
-216823425
-193439331
-167683147
-49487019
-45223520
271789961
275570429
444855014
559132135
612312607
664554739
677860351
1005278191
1031629361
1089012280
1115952521

我的意思是,问题/必须/出在我的比较函数中。有人注意到有什么奇怪的地方吗?

最佳答案

是的,你的“比较”溢出来了。 :(

原因:

当您从一个正数中减去一个负数时,您的结果不一定是正数;如果它不能用数据类型表示,它将“环绕”另一边。

示例:

如果您的整数只能容纳 -8 到 7(4 位),那么当您将 4 与 -4 进行比较时会发生什么?
好吧,你得到 8,它是二进制的 1000,也就是 -8。所以 4 小于 -4。

道德:

不要做减法而不是比较,即使他们在学校告诉你“看这多酷”!

关于C qsort 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6103636/

相关文章:

arrays - 我哪里越界了?

c - 有没有类似qsort()的函数可以用在内核空间?

c++ - 在 C++ 中排序时得到错误的输出

c - 自然排序与 qsort 不起作用

客户端/服务器交互

c - 如何修复 scanf 函数被忽略的问题

c - scanf() 之后跳过输入

c - 在 C 中对字符串数组使用 qsort

ios - Obj-c 如何继承一个有参数数组的方法?

我们可以在 C 中使用函数指针调用函数吗?