当前位置: 首页 > 知识库问答 >
问题:

根据 C 中一个数组的升序对结构中的多个数组进行排序

周墨一
2023-03-14

我试图根据一个数组的升序对多个数组进行排序。以下是示例:

int a[10] = {55140, 32294, 33321, 64321, 55312}
float b[10] = {11.11, 202.22, 3213.21, 144.32, 1.32}
const char* c[10] = {+, -, -, -, +}
unsigned char* d[10] = {22DS3K, 1FGJ29, 21FD43, 98DS03, 56DK23}

现在,在按升序排列数组“a”之后,我想对其他数组进行排序。输出应如下所示:

a[10] = {32294, 33321, 55140, 55312, 64321}
b[10] = {202.22, 3213.21, 11.11, 1.32, 144.32}
c[10] = {-, -, +, +, -}
d[10] = {1FGJ29, 21FD43, 22DS3K, 56DK23, 98DS03}

按升序排列很好。但是,我无法对其他数组进行排序。我想创建一个函数,在我的主函数中使用它。很高兴听到一些建议。

我看过下面的帖子,但没有帮助我。

在C #中基于一个数组对另一个数组排序

以下是我尝试过的代码:

struct Data{
    int a[10]; 
    float b[10];
    const char* c[10];
    unsigned char* d[10];
} data;

int data_a[10];
float data_b[10];
const char* data_c[10];
unsigned char* d[10];


void ascending(int *t; int N){
int i,j,tmp;
for(i=0;j<N;j++){
  for(j=i+1;j<N;j++){
     if(t[i] > t[j]){
       tmp=t[i];
       t[i]=t[j];
       t[j]=tmp;
}}}}

int main(){
   int i;
   for(i=0;i<5;i++){
   data.a[i] = data_a[i];
   data.b[i] = data_b[i];
   data.c[i] = data_c[i];
   data.d[i] = data_d[i];
   }
   ascending(data.a, 5);
   for(i=0;i<5;i++){
      printf("Data is %d,%.2f,%s,%hhn\n", data.a[i],data.b[i],data.c[i],data.d[i]};
   }}

我可以知道我是否遗漏了什么或者做了什么完全错误的事情吗?

共有1个答案

易焱
2023-03-14

保持这样一组阵列的同步是一场噩梦。您似乎想要的是一个结构数组,而不是5个单独的数组。

如果我猜对了,这是更适合您需求的: (此外,您的初始值设定项与数组 cd 的数据类型不匹配。

typedef struct data_s {
  int a;
  float b;
  const char *c;
  const char *d;
} data_t;

data_t data[10] = 
{
  [0] = {.a=55140, .b=11.11,   .c="+", .d="22DS3K"},
  [1] = {.a=32294, .b=202.22,  .c="-", .d="1FGJ29"},
  [2] = {.a=33321, .b=3213.21, .c="-", .d="21FD43"},
  [3] = {.a=64321, .b=144.32,  .c="-", .d="98DS03"},
  [4] = {.a=55312, .b=1.32,    .c="+", .d="56DK23"}
};

然后,您可以对结构的成员a进行排序(只需使用qsor),并且由于您将一次交换整个结构,因此相应的其他成员将被相应地排序:


int compare_a(const void *data1, const void*data2)
{
  return ((data_t*)data2)->a - ((data_t*)data1)->a;
}

int compare_d(const void *data1, const void*data2)
{
  return strcmp(((data_t*)data1)->d, ((data_t*)data2)->d);
}


int main(void)
{
...
  // optional:
  // Populate the missing fields with some default data
  size_t num_elem = sizeof(data)/sizeof(data[0]);
  for (size_t i = 5; i < num_elem; i++)
  {
    data[i].a = (int)i * 111;
    data[i].b = i * 1.11;
    data[i].c = "none";
    data[i].d = "";
  }

  // Sort for field a
  qsort(data, num_elem, sizeof (data[0]), compare_a);


  // Variant: Size unknown, use dynamic memory allocation
  size_t num_elem2 = 123;
  data_t *data2 = malloc(num_elem2 * sizeof (*data2));
  for (size_t i = 0; i < num_elem; i++)
  {
    data2[i].a = (int)i * 111;
    data2[i].b = i*1.11;
    data2[i].c = "none";
    data2[i].d = "";
  }
  // Sort for field d
  qsort(data, num_elem, sizeof (data[0]), compare_d);
}
 类似资料:
  • 我有两个整数数组,我试图根据另一个数组对第一个数组进行排序。 例如。和 b = {1,2,2,0,0, 在 B 中排序的值是 A 中每个整数的实值 排序后我期望的预期结果是: 这是我用的代码 它给出了我的输出:<code>a={2,3,1,0,0,6}和

  • 问题内容: 我有多个数组,我想根据其中一个的排序顺序对所有数组进行排序,如下所示: 我希望函数执行后,数组将如下所示: 问题答案: 您可以执行以下操作:首先根据键控数组的索引的索引对它们进行索引的值对它们进行排序,然后使用: 如果要在任何类型的集合上使它通用(但仍以与std lib集合算法相同的样式返回数组): 以及带有自定义比较器的版本:

  • 我有多个数组,我想根据其中一个数组的排序顺序对所有数组进行排序,如下所示: 我预计函数执行后的数组将如下所示:

  • 问题内容: 是否可以对看起来像这样的数组进行排序和重新排列: 匹配此数组的安排: 不幸的是,我没有任何要跟踪的ID。我将需要优先处理items-array,以使其尽可能接近sortingArr。 更新: 这是我正在寻找的输出: 任何想法如何做到这一点? 问题答案: 就像是: 这是一个较短的代码,但是会破坏数组:

  • 我正在尝试使用Java对由整数对字符串组成的数组进行排序 输入为: 所需的输出是: