【发布时间】:2016-10-16 17:03:42
【问题描述】:
我正在使用qsort 对结构数组进行排序,并且我正在寻找一种更有效的方法来通过对数组进行部分排序来提取前三个最高分数。我的结构如下所示:
typedef struct {
double score;
int player_num;
} player_t;
我已经分配了一个这样的结构数组:
player_t *players = malloc(SIZE * sizeof(player_t));
我对这个结构数组进行排序的方法是首先对分数进行排序,如果分数相同,则按玩家编号排序。
我的代码与qsort 如下所示:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
#define MAX 3
int scorecmp(const void *a, const void *b);
int ComparePlayerScore( const void* ap , const void* bp );
int CompareInt( const int a , const int b );
typedef struct {
double score;
int player_num;
} player_t;
int
main(int argc, char *argv[]) {
int i;
int player_numbers[] = {1, 2, 3, 4, 5, 6};
double scores[] = {0.765, 0.454, 0.454, 0.345, 0.643, 0.532};
player_t *players = malloc(SIZE * sizeof(player_t));
for (i = 0; i < SIZE; i++) {
players[i].score = scores[i];
players[i].player_num = player_numbers[i];
}
qsort(players, SIZE, sizeof(*players), ComparePlayerScore);
for (i = 0; i < MAX; i++) {
printf("Player %d: Score: %.3f\n", players[i].player_num, players[i].score);
}
free(players);
return 0;
}
int ComparePlayerScore( const void* ap , const void* bp ) {
const player_t* const a = ap;
const player_t* const b = bp;
if( a->score == b->score ){
return CompareInt( a->player_num , b->player_num );
}
else if( a->score > b->score ) {
return -1;
}
else {
return 1;
}
}
int CompareInt( const int a , const int b ) {
if( a < b ){
return -1;
}
else if( a > b ){
return 1;
}
return 0;
}
我只是在寻找另一种方法来做到这一点,但更有效的方法是提取前 3 名的分数以及各自的球员号码。就像我可以提取数组的前三个元素而不必每次都先对整个数组进行排序一样。
【问题讨论】:
-
我猜这是recently answered question的后续行动。
-
是的,我一直在对此进行试验,并尝试使其与
qsort一起使用,但如果不先对整个数组进行排序,我似乎无法做到这一点。似乎使用结构数组变得更加困难。 -
我想说不要担心这个级别的性能。您的数组只有 6 个大小,因此不值得优化可能多余的三个比较。保持代码简单。而且,如果您后来测量程序的这一部分是迄今为止最慢的,那么您才应该优化它。
-
您需要(部分)对数组进行排序,还是只查找得分最高的 3 个元素的索引值?
-
是的,就是这样,我很好奇阵列变大时的性能。但我不确定如何从理论上优化它。