gpt4 book ai didi

c - QSort 做错了什么?

转载 作者:行者123 更新时间:2023-11-30 18:32:19 24 4
gpt4 key购买 nike

我正在尝试使用 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);

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

最佳答案

你说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。在大多数现代系统上,这也是一个字节,但并非必须如此。

关于c - QSort 做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15048943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com