如何对结构的2D动态数组进行排序

Sta*_*ire 3 c arrays sorting struct

我在排序2D动态结构数组时遇到问题.

我有一个结构:

typedef struct abc
{
    int total;
} abc;
Run Code Online (Sandbox Code Playgroud)

和动态2D数组:

list = (abc**)malloc(listSize * sizeof(abc*));
    for (int i = 0; i < listSize; i++)
    {
        list[i] = (abc*)malloc(listSize2* sizeof(abc));
    }
Run Code Online (Sandbox Code Playgroud)

我想使用排序算法:

qsort(list, listSize, sizeof list[0], cmp);
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

但问题是虽然我认为它适用于一个小列表(如大约5个整数),但如果列表有点大,它就无法正确排序.我该怎么做cmp()函数才能正常工作?

顺便说一下,我只需要排序,list[x][0]因为我稍后会添加更多元素.

(我基于另一个Stackoverflow帖子的排序代码)

izo*_*ica 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;

}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)