我有一个struct数组(每个元素都是一行),它有一个float(每个元素都是一列)。假设表已完全初始化,我将如何按列对其进行排序..如何使用qsort()进行浮点数排序。我完全卡住了。我的代码:
typedef struct row
{
float value[20];
}ROW;
//in the main function I initalize ROW table[100]
my qsort call:
qsort(table, row, sizeof(*table), &compare);
my compare function:
int compare(const void* first, const void *second)
{
float firstTotal = (*(ROW **)first)->value;
float secondTotal = (*(ROW **)second)->value;
return firstTotal - secondTotal;
}
答案 0 :(得分:1)
如果要对每个结构中的元素进行排序,那么qsort调用将对浮点数组进行操作。
qsort(((ROW*)->value), 20, sizeof(float), comparefloats);
然后比较就在两个花车之间。
int comparefloats(const void *left, const void *right) {
float lt = *(float *)left;
float rt = *(float *)right;
return (fabs(lt - rt) < 0.0001)? 0:
lt - rt > 0? 1: -1;
}
对行本身进行排序,如果有更大的数组,将涉及比较两个数组的不太直接的概念。
正如你所说,你想按“列”排序,在这种情况下,遗憾的是qsort
不是你的朋友。你知道,这不是稳定的排序。因此,您不能按优先级递增的顺序逐行排序。
一次一个地对列进行排序(如果找到具有相同接口的稳定排序,则按顺序排序), 你需要为每一列提供不同的比较函数,或者每次调用时都要对不同的行为进行比较。显而易见的方法是使用全局变量。
int column_to_compare;
int comparefloatcolumn(const void *left, const void *right) {
float lt = (*(ROW *)left).value[ column_to_compare ];
float rt = (*(ROW *)right).value[ column_to_compare ];
return (fabs(lt - rt) < 0.0001)? 0:
lt - rt > 0? 1: -1;
}
然后你需要在每次调用qsort之前设置列。
column_to_compare = 0;
qsort(rowarray, 100, sizeof(ROW), comparefloatcolumn);