Qsort 对结构数组进行排序
Qsort to sort array of structs
我正在尝试使用 qsort 对结构数组进行排序。但是我在理解如何制作比较功能时遇到了问题。我有以下结构:
typedef struct {
char name[TEAM_SIZE];
int points;
} TEAM;
我正在尝试根据得分对每个团队进行排序,最高分在前。
qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points);
比较函数:
int compare_points(const void *a, const void *b) {
TEAM *p1 = (TEAM *)a;
TEAM *p2 = (TEAM *)b;
if(p1->points < p2->points) {
return 1;
}
else {
return -1;
}
}
你会怎么做?
输出:
Before:FCN 38
Before:FCM 59
Before:OB 46
Before:AGF 37
Before:AAB 50
Before:FCK 71
Before:HOB 18
Before:SDR 62
Before:RFC 47
Before:BIF 54
Before:EFB 30
Before:VFF 40
After:FCM 59
After 8
After:OB 46
After:AGF 37
After:AAB 50
After:FCK 71
After:HOB 18
After:SDR 62
After:RFC 47
After:BIF 54
After:EFB 30
After:VFF 40
你的qsort()
调用有误:
qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points);
第三个参数必须是数组每个元素的大小。您传递的是整个数组的大小或指针的大小,具体取决于 team
的声明方式。你想要:
qsort(team, NUMBER_OF_TEAMS, sizeof(TEAM), compare_points);
此外,您的比较函数有一点缺陷,它在 p1->points == p2->points
时 returns -1。由于您似乎在 points
成员上进行排序,因此当两支球队的积分相同时,您的比较函数应该 return 0。
例子
#include <stdio.h>
#include <stdlib.h>
#define TEAM_SIZE 10
typedef struct {
char name[TEAM_SIZE];
int points;
} TEAM;
int compare_points(const void *a, const void *b)
{
const TEAM *p1 = a;
const TEAM *p2 = b;
return p2->points < p1->points ? -1 : p1->points < p2->points;
}
int main()
{
TEAM teams[] =
{
{ "OB", 46 }, { "AGF", 37 },
{ "AAB", 50 }, { "FCK", 71 },
{ "HOB", 18 }, { "SDR", 62 },
{ "RFC", 47 }, { "BIF", 54 },
{ "EFB", 30 }, { "VFF", 40 }
};
size_t NUM_TEAMS = sizeof teams / sizeof *teams;
qsort(teams, NUM_TEAMS, sizeof(TEAM), compare_points);
for (size_t i=0; i< NUM_TEAMS; ++i)
printf("%s : %d\n", teams[i].name, teams[i].points);
return 0;
}
输出
FCK : 71
SDR : 62
BIF : 54
AAB : 50
RFC : 47
OB : 46
VFF : 40
AGF : 37
EFB : 30
HOB : 18
我正在尝试使用 qsort 对结构数组进行排序。但是我在理解如何制作比较功能时遇到了问题。我有以下结构:
typedef struct {
char name[TEAM_SIZE];
int points;
} TEAM;
我正在尝试根据得分对每个团队进行排序,最高分在前。
qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points);
比较函数:
int compare_points(const void *a, const void *b) {
TEAM *p1 = (TEAM *)a;
TEAM *p2 = (TEAM *)b;
if(p1->points < p2->points) {
return 1;
}
else {
return -1;
}
}
你会怎么做?
输出:
Before:FCN 38
Before:FCM 59
Before:OB 46
Before:AGF 37
Before:AAB 50
Before:FCK 71
Before:HOB 18
Before:SDR 62
Before:RFC 47
Before:BIF 54
Before:EFB 30
Before:VFF 40
After:FCM 59
After 8
After:OB 46
After:AGF 37
After:AAB 50
After:FCK 71
After:HOB 18
After:SDR 62
After:RFC 47
After:BIF 54
After:EFB 30
After:VFF 40
你的qsort()
调用有误:
qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points);
第三个参数必须是数组每个元素的大小。您传递的是整个数组的大小或指针的大小,具体取决于 team
的声明方式。你想要:
qsort(team, NUMBER_OF_TEAMS, sizeof(TEAM), compare_points);
此外,您的比较函数有一点缺陷,它在 p1->points == p2->points
时 returns -1。由于您似乎在 points
成员上进行排序,因此当两支球队的积分相同时,您的比较函数应该 return 0。
例子
#include <stdio.h>
#include <stdlib.h>
#define TEAM_SIZE 10
typedef struct {
char name[TEAM_SIZE];
int points;
} TEAM;
int compare_points(const void *a, const void *b)
{
const TEAM *p1 = a;
const TEAM *p2 = b;
return p2->points < p1->points ? -1 : p1->points < p2->points;
}
int main()
{
TEAM teams[] =
{
{ "OB", 46 }, { "AGF", 37 },
{ "AAB", 50 }, { "FCK", 71 },
{ "HOB", 18 }, { "SDR", 62 },
{ "RFC", 47 }, { "BIF", 54 },
{ "EFB", 30 }, { "VFF", 40 }
};
size_t NUM_TEAMS = sizeof teams / sizeof *teams;
qsort(teams, NUM_TEAMS, sizeof(TEAM), compare_points);
for (size_t i=0; i< NUM_TEAMS; ++i)
printf("%s : %d\n", teams[i].name, teams[i].points);
return 0;
}
输出
FCK : 71
SDR : 62
BIF : 54
AAB : 50
RFC : 47
OB : 46
VFF : 40
AGF : 37
EFB : 30
HOB : 18