C - Qsort By Count 然后按字母顺序
C - Qsort By Count then Alphabetically
我正在尝试 运行 qsort 以先按数字排序,然后按字母顺序排序。数组单词为:
COPY 3
CLOSER 2
TAUGHT 2
AW 2
LOOKS 2
SHAD 3
HA 3
结构是:
typedef struct {
char word[101];
int freq;
} Word;
我目前的比较函数是:
int compare(const void *c1, const void *c2){
Word *a1 = (Word *)c1;
Word *b1 = (Word *)c2;
return (b1->freq - a1->freq);
}
我的 qsort 函数是:
qsort(words, count, sizeof(Word), compare);
但我按频率排序后不知道如何按字母顺序排序。
理查德,请注意以下几点:
- 我在分配给非空指针时不转换空指针
- 我不是为了它而使用 typedef
- 为了得到数组的长度,我用数组的大小除以数组中第一个元素的大小
- 我在
struct word
中使用char *
- 我不会简单地减去
compare_words
中的频率。为了推导顺序,我实际上使用了if,else if,else。简单地减去整数可能会产生奇怪的行为,具体取决于操作数。
- 我在我的比较函数中维护
const
指针,以加强不变性。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct word {
char *str;
int freq;
};
int compare_words(const void *a, const void *b)
{
const struct word *w1 = a;
const struct word *w2 = b;
int order;
if (w2->freq > w1->freq) {
order = 1;
} else if (w2->freq < w1->freq) {
order = -1;
} else {
order = strcmp(w1->str, w2->str);
}
return order;
}
int main(int argc, char const *argv[])
{
struct word mywords[] = {
{ "BAR", 2 },
{ "BAS", 2 },
{ "ACK", 2 },
{ "FOO", 8 },
{ "ZIP", 1 }
};
int len = sizeof(mywords) / sizeof(mywords[0]);
qsort(mywords, len, sizeof(mywords[0]), compare_words);
int i;
for (i = 0; i < len; i++) {
struct word w = mywords[i];
printf("%s\t%d\n", w.str, w.freq);
}
return 0;
}
输出:
FOO 8
ACK 2
BAR 2
BAS 2
ZIP 1
我正在尝试 运行 qsort 以先按数字排序,然后按字母顺序排序。数组单词为:
COPY 3
CLOSER 2
TAUGHT 2
AW 2
LOOKS 2
SHAD 3
HA 3
结构是:
typedef struct {
char word[101];
int freq;
} Word;
我目前的比较函数是:
int compare(const void *c1, const void *c2){
Word *a1 = (Word *)c1;
Word *b1 = (Word *)c2;
return (b1->freq - a1->freq);
}
我的 qsort 函数是:
qsort(words, count, sizeof(Word), compare);
但我按频率排序后不知道如何按字母顺序排序。
理查德,请注意以下几点:
- 我在分配给非空指针时不转换空指针
- 我不是为了它而使用 typedef
- 为了得到数组的长度,我用数组的大小除以数组中第一个元素的大小
- 我在
struct word
中使用 - 我不会简单地减去
compare_words
中的频率。为了推导顺序,我实际上使用了if,else if,else。简单地减去整数可能会产生奇怪的行为,具体取决于操作数。 - 我在我的比较函数中维护
const
指针,以加强不变性。
char *
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct word {
char *str;
int freq;
};
int compare_words(const void *a, const void *b)
{
const struct word *w1 = a;
const struct word *w2 = b;
int order;
if (w2->freq > w1->freq) {
order = 1;
} else if (w2->freq < w1->freq) {
order = -1;
} else {
order = strcmp(w1->str, w2->str);
}
return order;
}
int main(int argc, char const *argv[])
{
struct word mywords[] = {
{ "BAR", 2 },
{ "BAS", 2 },
{ "ACK", 2 },
{ "FOO", 8 },
{ "ZIP", 1 }
};
int len = sizeof(mywords) / sizeof(mywords[0]);
qsort(mywords, len, sizeof(mywords[0]), compare_words);
int i;
for (i = 0; i < len; i++) {
struct word w = mywords[i];
printf("%s\t%d\n", w.str, w.freq);
}
return 0;
}
输出:
FOO 8
ACK 2
BAR 2
BAS 2
ZIP 1