3

我在对 2D 动态结构数组进行排序时遇到问题。

我有一个结构:

typedef struct abc
{
    int total;
} abc;

还有一个动态二维数组:

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]因为我稍后会添加更多元素。

(我的排序代码来自另一个 Stackoverflow 帖子)

4

2 回答 2

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;
    }
}
于 2013-09-27T09:01:00.400 回答
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整体是否存储在单个内存块中并不重要。是否已动态分配都无关紧要:)

于 2013-09-27T08:46:29.700 回答