对带有数字和字符的结构进行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->freq
和 B->freq
不 相等。在那种情况下,你不能只是 return -1
。在那种情况下,你需要比较
A->freq
和 B->freq
就像您在第一个函数中所做的那样。所以...
改变
else{
return -1;
}
到
return ( B->freq - A->freq );
或更好 - 将其更改为
if ( B->freq > A->freq ) return 1;
return -1;
想对带有数字和字符的结构进行 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->freq
和 B->freq
不 相等。在那种情况下,你不能只是 return -1
。在那种情况下,你需要比较
A->freq
和 B->freq
就像您在第一个函数中所做的那样。所以...
改变
else{
return -1;
}
到
return ( B->freq - A->freq );
或更好 - 将其更改为
if ( B->freq > A->freq ) return 1;
return -1;