用QSort做错了什么?

时间:2013-02-24 05:20:18

标签: c

我正在尝试使用qsort对几个不同的int数组进行排序,但它似乎没有执行排序。这是我的比较器函数,一个用于向前排序,一个用于向后排序:

int comp(const void *elem1, const void *elem2){
    int x = *(int*)elem1;
    int y = *(int*)elem2;
    if(x > y) return 1;
    if (x < y ) return -1;
    return 0;
}

int compReverse(const void *elem1, const void *elem2) {
    int x = *(int*)elem1;
    int y = *(int*)elem2;
    if (x > y) return -1;
    if (x < y) return 1;
    return 0;
}

这是我调用qsort的地方。要排序的项目是malloc'ed int * s。 NELEMS是一个#define,它将数组的总字节大小除以int的大小以获得数组长度。

qsort(ascendingOrderArray, NELEMS(ascendingOrderArray),
            sizeof(*ascendingOrderArray),comp);
    qsort(descendingOrderArray, NELEMS(descendingOrderArray),
            sizeof(*descendingOrderArray), compReverse);

当我遍历新数组时,它们不符合我的预期。事实上,除了第一个数字的位置之外,它们根本没有顺序,并且与未排序的数组无法区分。这是怎么回事?

1 个答案:

答案 0 :(得分:4)

您说ascendingOrderArray是通过malloc()分配的,因此定义必须是:

int *ascendingOrderArray;

但是你说NELEMS()被定义为将数组的大小除以int的大小,所以我假设定义是这样的:

#define NELEMS(x) (sizeof(x) / sizeof(int))

如果是这种情况,则代码不会按照您的想法执行。这里,sizeof(ascendingOrderArray)指针的大小(以字符为单位[1])(在32位系统上,该值很可能是4;在64位系统上, 8)。然后将它除以整数的大小(32位系统最可能是4; 64位系统它可能是4,可能是8 ---它取决于编译器)。如果NELEMS()返回值1,我不会感到惊讶,这不会给qsort()很多工作。

您需要做的是致电qsort(),如:

qsort(ascendingOrderArray,itemsInArray,sizeof(int),comp);

其中itemsInArray是分配数组中元素数量的单独计数。

[1]在C中,sizeof()返回相对于char大小的类型大小;根据定义,sizeof(char)为1。在大多数现代系统中,这也是一个字节,但它不一定是。