如何在C中将3个数组排序在一起

Que*_*est 3 c arrays sorting multidimensional-array

我有3个数组:A,BC:

char A[6][10];
int B[6];
int C[6];
Run Code Online (Sandbox Code Playgroud)

我想要同时对上面3个数组(具有相同的n#元素)进行排序.如果我将数组B从最低值排序到最高值,那么我希望数组AC遵循B的模式.这可能是更好的解释,下面有一个例子.

我在下面有一个代码尝试这个,我的问题是如何编辑/修复我的代码来执行下面描述的同步排序功能?

未排序列表:

A[6]              B[6]          C[6]      
John               12           2
David              30           1
Michael            12           2
Steve              12           1
Sam                19           2
Claire             12           1
Run Code Online (Sandbox Code Playgroud)

然后我想从最低到最高排序B [i],而A [i]C [i]根据B [i]排序

A[6]              B[6]          C[6]      
John               12           2
Michael            12           2
Steve              12           1
Claire             12           1
Sam                19           2
David              30           1
Run Code Online (Sandbox Code Playgroud)

那么如果B [i]中有相同/相同的数字,那么我想从最低到最高C [i]进行排序,导致A [i]B [i]根据C [i]排序:

A[6]              B[6]          C[6]      
Steve              12           1
Claire             12           1
John               12           2
Michael            12           2
Sam                19           2
David              30           1
Run Code Online (Sandbox Code Playgroud)

然后,如果来自A [i]的 2个名称在B [i]C [i]中具有相似性,则按字母顺序对A [i]进行排序.

A[6]              B[6]          C[6]   
Claire             12           1   
Steve              12           1
John               12           2
Michael            12           2
Sam                19           2
David              30           1
Run Code Online (Sandbox Code Playgroud)

我写了一个代码来尝试这样做,但我有点挣扎导致1个数组将simulatanuosly排序到另一个数组. 任何人都可以指出我做错了什么或描述更好/最好的方式来做这种类型的排序?

#include <stdio.h>

main()
{

char A[6][10]={"John","David","Michael","Steve","Sam","Claire"};
int B[6] = {12,30,12,12,19,12};
int C[6] = {2,1,2,1,2,1}; 
int i=0;
int true=1;


for (i=0;i<6;i++)
{
printf("%s\t%d\t%d\n",A[i],B[i],C[i]);
}

while(1)
    {
        true = 0;

        for (i=0;i<6;i++){

            if(B[i]> B[i+1]){
                int temp = B[i];
                B[i] = B[i+1];
                B[i+1] = temp;
                C[i]= C[i+1];
                swapped = 1;
            }

        }
        if (true==0){
            break;
        }
    }

printf("\nnew list\n");

    for (i=0;i<6;i++)
        {
        printf("%s\t%d\t%d\n",A[i],B[i],C[i]);
        }


}
Run Code Online (Sandbox Code Playgroud)

输出代码:

John    12      2
David   30      1
Michael 12      2
Steve   12      1
Sam     19      2
Claire  12      1

new list
John    12      2
David   12      2
Michael 12      1
Steve   12      1
Sam     19      1
Claire  30      1
Run Code Online (Sandbox Code Playgroud)

谢谢

JS1*_*JS1 6

所有其他答案都是正确的,指出你没有正确交换A和C. 但我会尝试回答"什么是最好的方式"这个问题.理想情况下,由于您的A,B和C数组都彼此相关,因此您应该使用结构数组而不是3个单独的数组.我不知道你是否已经了解了结构,但这是一个如何使用结构重写代码的例子:

#include <stdio.h>
#include <stdbool.h>

typedef struct Person {
    char name[10];
    int  age;
    int  group;
} Person;

#define DIM(a)              (sizeof(a)/sizeof(a[0]))

main()
{
    Person people[] = {
        { "John",    12, 2 },
        { "David",   30, 1 },
        { "Michael", 12, 2 },
        { "Steve",   12, 1 },
        { "Sam",     19, 2 },
        { "Claire",  12, 1 }
    };
    int i=0;
    int n=0;

    for (i=0;i<DIM(people);i++)
        printf("%s\t%d\t%d\n", people[i].name, people[i].age, people[i].group);

    // Here I used a bubble sort since it seemed like what you were doing.
    n = DIM(people)-1;
    while (1) {
        bool swapped = false;
        for (i=0;i<n;i++) {
            if (people[i].age > people[i+1].age) {
                Person temp = people[i];
                people[i]   = people[i+1];
                people[i+1] = temp;
                swapped = true;
            }
        }
        n--;
        if (!swapped)
            break;
    }

    printf("\nnew list\n");

    for (i=0;i<DIM(people);i++)
        printf("%s\t%d\t%d\n", people[i].name, people[i].age, people[i].group);
}
Run Code Online (Sandbox Code Playgroud)