我无法对2D动态结构数组进行排序。
我有一个结构:
typedef struct abc
{
int total;
} abc;
动态2D数组:
list = (abc**)malloc(listSize * sizeof(abc*));
for (int i = 0; i < listSize; i++)
{
list[i] = (abc*)malloc(listSize2* sizeof(abc));
}
我想使用排序算法:
qsort(list, listSize, sizeof list[0], cmp);
和qsort的比较函数:
int cmp(const void *l, const void *r)
{
const abc *a = *(const abc **)l;
const abc *b = *(const abc **)r;
return a[0].total > b[0].total;
}
但问题是虽然我认为它适用于一个小列表(如大约5个整数),但如果列表有点大,它就无法正确排序。我该怎么做才能使cmp()函数正常工作?
顺便说一句,我只需要对list[x][0]
进行排序,因为我稍后会添加更多元素。
(I'm basing my sorting code from another Stackoverflow post)
答案 0 :(得分:5)
将比较功能更改为:
int cmp(const void *l, const void *r)
{
const abc *a = *(const abc **)l;
const abc *b = *(const abc **)r;
return a[0].total - b[0].total;
}
使用qsort
预期的比较函数应该返回负数,如果第一个值小于正数,如果它更大,则返回0,如果两个值相等。
编辑:感谢WhozCraig:如果你认为你可能会遭遇打击或溢出,你可以选择更安全的版本:
int cmp(const void *l, const void *r)
{
const abc *a = *(const abc **)l;
const abc *b = *(const abc **)r;
if (a[0].total < b[0].total) {
return -1;
} else if (a[0].total > b[0].total) {
return 1;
} else {
return 0;
}
}
答案 1 :(得分:2)
具有以下结构:
typedef struct abc {
int total;
} ABC;
比较功能可以简单如下:
int cmp(const void *l, const void *r)
{
const ABC *a = (const ABC *) l;
const ABC *b = (const ABC *) r;
if (a->total == b->total) return 0;
return (a->total < b->total) ? -1 : 1;
}
用作例如:
ABC list[][4] = {{{5},{2},{0},{4}},
{{7},{3},{9},{1}},
{{8},{6},{5},{7}},
{{2},{7},{9},{5}}};
qsort(list, 4 * 4, sizeof(ABC), cmp);
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j)
printf("%d ",list[i][j].total);
输出:0 1 2 2 3 4 5 5 5 6 7 7 7 8 9 9
。
如果您只想在行内对其进行排序,您可以这样做:
for (int i = 0; i < 4; ++i)
qsort(list[i], 4, sizeof(ABC), cmp);
会给你:0 2 4 5 1 3 7 9 5 6 7 8 2 5 7 9
。在这种情况下(在行内排序),整个list
是否存储在单个内存块中并不重要。如果动态分配它是否重要:)