对带有数字和字符的结构进行qsort,首先对数字进行排序,然后对具有相同数字的字母表进行排序

qsort on struct with number and char, sort on number first and then sort on alphabet with same number

想对带有数字和字符的结构进行 qsort,先按数字排序,然后按具有相同数字的字母表排序 这是我的结构

typedef struct{
    char word[101];
    int freq;
}WordArray;

这是我遵循的逻辑:先按频率排序 ()

int cmpffunc (const void * a, const void * b)
{
    WordArray *WordArrayA = (WordArray *)a;
    WordArray *WordArrayB = (WordArray *)b;
    return ( WordArrayB->freq - WordArrayA->freq );
}
qsort(array, arrayLength, sizeof(WordArray), cmpffunc);

效果很好,然后我尝试使用相同的频率编号对字母表进行排序。这是我尝试过的方法,但没有一个能按预期工作:

int cmpwfunc (const void * a, const void * b)
{
    WordArray *A = (WordArray *)a;
    WordArray *B = (WordArray *)b;
    if (A->freq == B->freq){
        return strcmp(A->word,B->word);
    }
    else{
        return -1;
    }
}
qsort(array, arrayLength, sizeof(WordArray), cmpwfunc);

如有任何建议,我们将不胜感激。

第二个版本的问题是 A->freqB->freq 相等。在那种情况下,你不能只是 return -1。在那种情况下,你需要比较 A->freqB->freq 就像您在第一个函数中所做的那样。所以...

改变

else{
    return -1;
}

return ( B->freq - A->freq );

或更好 - 将其更改为

if ( B->freq > A->freq ) return 1;
return -1;