根据C中一个数组的升序对结构中的多个数组进行排序
Sorting multiple arrays in the struct based on the ascending order of one array in C
我正在尝试根据一个数组的升序对多个数组进行排序。
这是示例:
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}
升序排列没问题。但是,我无法对其他数组进行排序。我想创建一个函数以在我的主要函数中使用它。很高兴听到一些建议。
我看过下面的post,但对我没有帮助。
这是我试过的代码:
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]};
}}
我可以知道我是否遗漏了什么或做错了什么吗?
让这样一组数组保持同步是一场噩梦。
您似乎想要的是一个结构数组,而不是 5 个单独的数组。
如果我没看错,下面的内容更符合您的需求:
(此外,您的初始值设定项与数组 c
和 d
的数据类型并不匹配。)
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
进行排序(只需使用 qsort
),因为您将立即交换整个结构,相应的其他成员将相应地排序:
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);
}
我正在尝试根据一个数组的升序对多个数组进行排序。 这是示例:
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}
升序排列没问题。但是,我无法对其他数组进行排序。我想创建一个函数以在我的主要函数中使用它。很高兴听到一些建议。
我看过下面的post,但对我没有帮助。
这是我试过的代码:
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]};
}}
我可以知道我是否遗漏了什么或做错了什么吗?
让这样一组数组保持同步是一场噩梦。 您似乎想要的是一个结构数组,而不是 5 个单独的数组。
如果我没看错,下面的内容更符合您的需求:
(此外,您的初始值设定项与数组 c
和 d
的数据类型并不匹配。)
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
进行排序(只需使用 qsort
),因为您将立即交换整个结构,相应的其他成员将相应地排序:
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);
}