我在排序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的compare函数:
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]
因为稍后我将添加更多元素。
将比较功能更改为:
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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句