0

我有一个结构数组(每个元素是一行),它有一个浮点数(每个元素是一列)。假设表已完全初始化,我将如何按列对它进行排序。我将如何使用 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;
}
4

1 回答 1

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);
于 2013-09-20T11:35:54.600 回答