假设我有以下数组:
int A[5]={2,3,5,4,1};
在此数组中,每个索引代表一个玩家。例如:
A[0]=player 0
A[1]=player 1
.....
我想按照这样的降序对数组进行排序:
A[5]={5,4,3,2,1};
并且我想跟踪播放器的上一个索引,以便我可以像这样编写已排序的数组:
{player 2, player 4, player 1, player 0,player 4}
总之,我想跟踪原始索引。我用C编写了一个程序,用qsort按降序排列元素。
#include <stdio.h>
#include <stdlib.h>
int A[] = {2,3,5,4,1};
int compare (const void * a, const void * b)
{
return ( *(int*)b - *(int*)a );
}
int main ()
{
int n;
qsort (A, 5, sizeof(int), compare);
for (n=0; n<5; n++)
printf ("%d ",A[n]);
return 0;
}
是否可以使用此qsort跟踪原始索引?
答案 0 :(得分:4)
这是一个常见的要求。一种可能的方法是用2个元素结构和数组替换int数组:
struct PlayerScore {
int playerId;
int score;
}
您的代码可能会变成:
#include <stdio.h>
#include <stdlib.h>
int A[] = {2,3,5,4,1};
#define N sizeof(A)/sizeof(A[0])
struct PlayerScore {
int playerId;
int score;
};
int compare (const void * a, const void * b)
{
return ( (*(struct PlayerScore*)b).score - (*(struct PlayerScore*)a).score );
}
int main ()
{
int n;
struct PlayerScore ps[N];
for(n=0;n<N; n++) {
ps[n].playerId = n;
ps[n].score = A[n];
}
qsort (ps, 5, sizeof(struct PlayerScore), compare);
for (n=0; n<N; n++)
printf ("%d (%d) ",ps[n].score, ps[n].playerId);
return 0;
}
你终于得到了:
5 (2) 4 (3) 3 (1) 2 (0) 1 (4)
答案 1 :(得分:2)
你的问题与qsort无关,而只是程序设计。
“在这个数组中,每个索引代表一个玩家”是问题。您已经发明了数组索引和内容之间的奇怪依赖关系,即使您想要更改数组索引。
使用填充了神秘“魔数”的int数组,而不是使用有意义数据的结构数组。
例如,它可能是这样的:
typedef struct
{
// whatever makes sense to store here, names, stats etc
} player_t;
player_t players [] =
{
{0, ...},
{1, ...},
};
现在您可以根据自己喜欢的内容来搜索该表。
请注意,出于性能原因,最好声明一个指向struct-struct的数组,然后qsort该数组。对于qsort来说,数据改组的数据要少得多。
答案 2 :(得分:0)
您需要对数字对进行排序,例如将每条信息存储在结构中:
struct player {
int data;
int index;
};
struct player A[] = {{2,0}, {3,1}, {5,2}, {4,3}, {1,4}};
int compare (const void * a, const void * b)
{
return ( ((struct player*)b)->data - ((struct player*)a)->data );
}
int main ()
{
int n;
qsort (A, 5, sizeof(struct player), compare);
for (n=0; n<5; n++)
printf ("data=%d, index=%d\n", A[n].data, A[n].index);
return 0;
}