首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用qsort存储排序后的原始索引

使用qsort存储排序后的原始索引
EN

Stack Overflow用户
提问于 2016-09-28 21:34:10
回答 3查看 2.3K关注 0票数 1

假设我有以下数组:

代码语言:javascript
复制
int A[5]={2,3,5,4,1};

在这个数组中,每个索引代表一个玩家。例如:

代码语言:javascript
复制
A[0]=player 0
A[1]=player 1
.....

我想按降序对数组进行排序,如下所示:

代码语言:javascript
复制
A[5]={5,4,3,2,1};

我还想跟踪玩家的前一个索引,这样我就可以像这样编写排序数组:

代码语言:javascript
复制
{player 2, player 4, player 1, player 0,player 4} 

一言以蔽之,我想跟踪原始的索引。我已经用C语言编写了一个程序,使用qsort将元素按降序排列。

代码语言:javascript
复制
#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来跟踪原始索引?

EN

回答 3

Stack Overflow用户

发布于 2016-09-28 21:51:36

这是一个常见的需求。一种可能的方法是将int数组替换为包含2个元素的and数组结构:

代码语言:javascript
复制
struct PlayerScore {
    int playerId;
    int score;
}

你的代码可能会变成:

代码语言:javascript
复制
#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;
}

你最终会得到:

代码语言:javascript
复制
5 (2) 4 (3) 3 (1) 2 (0) 1 (4)
票数 4
EN

Stack Overflow用户

发布于 2016-09-28 21:51:49

你的问题与qsort无关,而仅仅是程序设计。

“在这个数组中,每个索引代表一个玩家”就是问题所在。

用有意义的数据组成一个结构数组,而不是用神秘的“魔术数字”填充int数组。

例如,它可能是这样的:

代码语言:javascript
复制
typedef struct
{
  // whatever makes sense to store here, names, stats etc      
} player_t;

player_t players [] = 
{
  {0, ...},
  {1, ...},
};

现在,您可以根据您喜欢的任何内容对该表进行Q排序。

请注意,出于性能原因,最好先声明一个指向结构的指针数组,然后对该数组进行qsort。通过这种方式,qsort的数据混洗要少得多。

票数 2
EN

Stack Overflow用户

发布于 2016-09-28 21:49:24

您需要对数字对进行排序,例如,通过将每条信息存储在一个结构中:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39749111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档