-1

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

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);

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

4

1 回答 1

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——这取决于编译器)。如果返回 1 的值,我不会感到惊讶NELEMS(),这并没有提供qsort()很多工作。

你需要做的是这样的调用qsort()

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

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

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

于 2013-02-24T06:00:10.640 回答