Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对一个数组排序并将顺序复制到另一个数组_C_Arrays - Fatal编程技术网

C 对一个数组排序并将顺序复制到另一个数组

C 对一个数组排序并将顺序复制到另一个数组,c,arrays,C,Arrays,我有两个并排排列的数组,一个列出不同的队,另一个列出分数。我能按分数的降序排列。然后,可以使用此命令将相应的团队移动到领导委员会的正确位置吗?将两支得分为100分的球队(美国队和德国队)排在榜首 #include <stdio.h> int main() { char teams[18][20]={"England","Ireland","Wales","Scotland","France","Italy","Germany","Uraguay","Belgium","USA"

我有两个并排排列的数组,一个列出不同的队,另一个列出分数。我能按分数的降序排列。然后,可以使用此命令将相应的团队移动到领导委员会的正确位置吗?将两支得分为100分的球队(美国队和德国队)排在榜首

#include <stdio.h>

int main() 
{
 char teams[18][20]={"England","Ireland","Wales","Scotland","France","Italy","Germany","Uraguay","Belgium","USA","Mexico","Australia","Belize","Denmark","Sweden","Japan","South Africa","Algeria"};
 int points[18]={43,5,77,23,89,0,100,46,94,100,45,55,32,65,11,37,26,78};
 int i;
 int j;
 int a;

 for (i = 0; i < 18; ++i)
 {
        printf("%i  ",i+1);
        printf("%s",teams[i]);
        printf("\t%d\n", points[i]);
 }
 printf("\n");
 for (i = 0; i < 18; ++i)
 {
        for (j = i + 1; j < 18; ++j)
        {
            if (points[i] < points[j])
            {
                a =  points[i];
                points[i] = points[j];
                points[j] = a;
            }
        }
    }
  for (i = 0; i < 18; ++i)
  {
        printf("%i  ",i+1);
        printf("%s",teams[i]);
        printf("\t%d\n", points[i]);
  }
  return 0;
  }
#包括
int main()
{
char团队[18][20]={“英格兰”、“爱尔兰”、“威尔士”、“苏格兰”、“法国”、“意大利”、“德国”、“乌拉瓜”、“比利时”、“美国”、“墨西哥”、“澳大利亚”、“伯利兹”、“丹麦”、“瑞典”、“日本”、“南非”、“阿尔及利亚”};
整数点[18]={43,5,77,23,89,0100,46,94100,45,55,32,65,11,37,26,78};
int i;
int j;
INTA;
对于(i=0;i<18;++i)
{
printf(“%i”,i+1);
printf(“%s”,团队[i]);
printf(“\t%d\n”,点[i]);
}
printf(“\n”);
对于(i=0;i<18;++i)
{
对于(j=i+1;j<18;++j)
{
如果(点[i]<点[j])
{
a=点[i];
点[i]=点[j];
点[j]=a;
}
}
}
对于(i=0;i<18;++i)
{
printf(“%i”,i+1);
printf(“%s”,团队[i]);
printf(“\t%d\n”,点[i]);
}
返回0;
}

如评论中所述,典型的解决方案是将数据建模为结构数组,而不是单独的数组。这是有意义的,因为数据是相互关联的

你会有类似于:

struct score {
  const char *name;
  int points;
} scores[] = {
{ "England", 43 },
{ "Ireland", 5 },
/* and so on */
};

然后,您可以使用
qsort()
(或者您自己的排序代码,如果您感兴趣的话)对整个结构实例进行排序,因为整个结构都在移动,所以所有数据都将保持在一起。

如注释中所述,典型的解决方案是将数据建模为结构数组,而不是单独的数组。这是有意义的,因为数据是相互关联的

你会有类似于:

struct score {
  const char *name;
  int points;
} scores[] = {
{ "England", 43 },
{ "Ireland", 5 },
/* and so on */
};

然后,您可以使用
qsort()
(或者您自己的排序代码,如果您感兴趣的话)对整个结构实例进行排序,因为整个结构都在移动,所以所有的数据都将保持在一起。

在排序时也会排列您的团队数组

a = points[i];
b = teams[i];
points[i] = points[j];
teams[i] = teams[j];
points[j] = a;
teams[j] = b;

在排序时,还要安排您的团队阵列

a = points[i];
b = teams[i];
points[i] = points[j];
teams[i] = teams[j];
points[j] = a;
teams[j] = b;
显而易见的方法(正如其他人所指出的)是将数组嵌入到
结构中,但如果您被迫使用并行数组,您可以构建自己的函数并同时对两个数组进行排序:

#include <stdio.h>

static int comp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

static void swap(int v1[], char *v2[], int a, int b)
{
    int temp1;
    char *temp2;

    temp1 = v1[a];
    v1[a] = v1[b];
    v1[b] = temp1;
    temp2 = v2[a];
    v2[a] = v2[b];
    v2[b] = temp2;
}

static void sort(int v1[], char *v2[], int left, int right, int (*comp)(const void *, const void *))
{
    int i, last;

    if (left >= right) return;
    swap(v1, v2, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right; i++) {
        if (comp(&v1[i], &v1[left]) < 0)
            swap(v1, v2, ++last, i);
    }
    swap(v1, v2, left, last);
    sort(v1, v2, left, last - 1, comp);
    sort(v1, v2, last + 1, right, comp);
}

int main(void) 
{
    char *teams[] = {"England","Ireland","Wales","Scotland","France","Italy","Germany","Uraguay","Belgium","USA","Mexico","Australia","Belize","Denmark","Sweden","Japan","South Africa","Algeria"};
    int points[] = {43,5,77,23,89,0,100,46,94,100,45,55,32,65,11,37,26,78};
    size_t i, n = sizeof(points) / sizeof(*points);

    sort(points, teams, 0, n - 1, comp);
    for (i = 0; i < n; i++) {
        printf("%s->%d\n", teams[i], points[i]);
    }
    return 0;
}
显而易见的方法(正如其他人所指出的)是将数组嵌入到
结构中,但如果您被迫使用并行数组,您可以构建自己的函数并同时对两个数组进行排序:

#include <stdio.h>

static int comp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

static void swap(int v1[], char *v2[], int a, int b)
{
    int temp1;
    char *temp2;

    temp1 = v1[a];
    v1[a] = v1[b];
    v1[b] = temp1;
    temp2 = v2[a];
    v2[a] = v2[b];
    v2[b] = temp2;
}

static void sort(int v1[], char *v2[], int left, int right, int (*comp)(const void *, const void *))
{
    int i, last;

    if (left >= right) return;
    swap(v1, v2, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right; i++) {
        if (comp(&v1[i], &v1[left]) < 0)
            swap(v1, v2, ++last, i);
    }
    swap(v1, v2, left, last);
    sort(v1, v2, left, last - 1, comp);
    sort(v1, v2, last + 1, right, comp);
}

int main(void) 
{
    char *teams[] = {"England","Ireland","Wales","Scotland","France","Italy","Germany","Uraguay","Belgium","USA","Mexico","Australia","Belize","Denmark","Sweden","Japan","South Africa","Algeria"};
    int points[] = {43,5,77,23,89,0,100,46,94,100,45,55,32,65,11,37,26,78};
    size_t i, n = sizeof(points) / sizeof(*points);

    sort(points, teams, 0, n - 1, comp);
    for (i = 0; i < n; i++) {
        printf("%s->%d\n", teams[i], points[i]);
    }
    return 0;
}

将团队和点放在结构数组中,而不是放在单独的数组中。将团队和点放在结构数组中,而不是放在单独的数组中。