加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:47:43 所属栏目:百科 来源:网络整理
导读:我在排序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)); } 我想使
我在排序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()函数才能正常工作?

顺便说一句,我只需要对列表[x] [0]进行排序,因为我稍后会添加更多元素.

(I’m basing my sorting code from another Stackoverflow post)

解决方法

将比较功能更改为:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读