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

标签 c arrays sorting multidimensional-array

我有 3 个数组:A、BC:

char A[6][10];
int B[6];
int C[6];

我希望同时对上述 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

然后我想将 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

然后如果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

然后如果 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

我编写了一个代码来尝试执行此操作,但我在使 1 个数组同时排序到另一个数组方面遇到了一些困难。 任何人都可以指出我做错了什么或描述进行此类排序的更好/最佳方法吗?

#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]);
        }


}

代码输出:

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

谢谢

最佳答案

所有其他答案都正确,指出您没有正确交换 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);
}

关于c - 如何在C中将3个数组排序在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695133/

相关文章:

c - 无法更改核心转储文件的文件名

arrays - 如何使用批处理在数组(for 循环)中一次处理两个元素?

php - 如何在php中将一个字符串变成一个数组

python - 如何根据另一个数组中的重复值添加一个数组中的值?

c - 在 C 语言中搜索文件中的特定单词

x86 寄存器重命名的成本

c - 读取一个字符串并将其放入C中的(int)中

c# - 如何使用 SQL 值动态填充列表框

java - 对以 map 作为输入的列表进行排序

C - 以相同方式对两个数组进行排序