我正在使用qsort
對結構數組進行排序,並且我正在尋找一種更高效的方法,通過對數組進行部分排序來提取排名前三的最高分數。我的結構是這樣的:高效地對結構數組進行排序
typedef struct {
double score;
int player_num;
} player_t;
,我已經malloced結構數組是這樣的:
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名的成績,與各玩家數字一起。就像我可以提取數組的前三個元素一樣,而不必每次都先排序整個數組。
我想這是一個後續的[最近回答問題(http://stackoverflow.com/questions/40061974/partially-sorting-an-array -C)。 –
是的,我一直在試驗這個,並試圖使它與'qsort'一起工作,但我似乎無法做到這一點,沒有先排序整個數組。看起來使用一系列結構會讓它變得更加困難。 – RoadRunner
我會說不要擔心在這個級別的表現。你的數組只有大小6,所以不值得優化掉可能是多餘的三個比較。保持你的代碼簡單。而且,如果你後來有_measured_這個程序的這部分是最慢的,那麼你應該優化它。 –