簡體   English   中英

如何使用qsort(C)對結構數組中的數據進行排序

[英]How to sort data in a struct array using qsort (C)

我有一個結構數組(每個元素是一行),有一個浮點數(每個元素是一列)。 假設表格已完全初始化,我如何按列對該列進行排序..我將如何使用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;
}

如果要對每個結構中的元素進行排序,則您的qsort調用將在float數組上進行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM