C 使用qsort对多个数组进行排序
我有一个包含多个数组的结构。我需要能够对这些数组中的任何一个进行排序,并根据排序后的数组对其他数组中的元素进行移位C 使用qsort对多个数组进行排序,c,C,我有一个包含多个数组的结构。我需要能够对这些数组中的任何一个进行排序,并根据排序后的数组对其他数组中的元素进行移位 struct arrayset { int values1[] = { 32, 10, 101, 72, 13, 5 }; int values2[] = { 40, 10, 100, 90, 20, 2 }; int values3[] = { 16, 14, 93, 2, 37, 39 }; }; 我知道如何只使用一个数组,但我不确定是否有一种优雅的方式来更改其他两个数组中的
struct arrayset
{
int values1[] = { 32, 10, 101, 72, 13, 5 };
int values2[] = { 40, 10, 100, 90, 20, 2 };
int values3[] = { 16, 14, 93, 2, 37, 39 };
};
我知道如何只使用一个数组,但我不确定是否有一种优雅的方式来更改其他两个数组中的元素。我不想对其他两个数组进行排序,但我希望元素继续匹配后期排序,而不是混淆。有什么建议吗
qsort(arrayset.values1,6,sizeof(int), compare);
//values2/3 elements would follow values1's elements
#包括
#包括
#包括
结构阵列集{
int*值1;
int*值2;
int*值3;
};
无效自定义排序(结构数组集*v,大小大小);
int main(){
结构阵列设置工作={
(int[]){32,10,101,72,13,5},
(int[]){40,10,100,90,20,2},
(int[]){16,14,93,2,37,39}
};
定制分拣和工作,6);
对于(int i=0;ikey;
intb=((常数对*)y)->密钥;
返回ab;
}
无效自定义排序(结构数组集*v,大小){
配对键[大小];
对于(int i=0;ivalues1[i];
键[i]。值=i;
}
qsort(键、大小、尺寸(对)、cmp);
int v1[size],v2[size],v3[size];
memcpy(v1,v->values1,size*sizeof(int));
memcpy(v2,v->values2,size*sizeof(int));
memcpy(v3,v->values3,size*sizeof(int));
对于(int i=0;ivalues1[i]=v1[key[i].value];
v->values2[i]=v2[键[i].值];
v->values3[i]=v3[key[i].value];
}
}
每当我遇到这种类型的问题时,我都会抓取一个qsort实现,并对其进行修改,以在比较函数之外接受一个附加的交换函数
通过这种方式,您可以交换所有并行数据中的项。在必须对多个独立数据结构执行同步重新排列的情况下,您可以采用以下两种方法之一:
{0,1,2,3,…}
初始化一个整数索引数组p
。不要直接对值1
排序,而是对该索引数组p
排序,使其为值1
数组生成正确的排序。(标准的qsort
函数对于此类应用程序不太适用,因为它是无上下文的。)
排序后,该索引数组将用作您的排列。您所需要做的就是根据该排列重新排列三个数组中的每一个。它可以就地完成,也可以更容易地就地完成,具体取决于您的需要
在您的特定示例中,您将从索引数组开始
p = { 0, 1, 2, 3, 4, 5 }
分类后,它将变成
p = { 5, 1, 4, 0, 3, 2 }
这是对values1
数组的所谓from排列:它告诉您,为了获得values1
的排序版本,位置i
处的元素应从values1[p[i]]
。现在,您需要做的就是使用排列p
中的相同内容生成重新排列的values1
、values2
和values3
同样,后一步很容易在不适当的地方完成,在适当的地方更难完成。在这里,您可以找到从置换中进行就地重排的一些相关实现:使用
struct set{int v1,v2,v3;}数组[6]是否可行;
?不确定你的意思,你能详细说明一下吗?你是在指出结构的问题,还是想看看我是否可以以不同的方式声明数组?看起来你想把三个值组合在一起。你可以用这三个值创建一个结构,然后再创建一个这样的组的整个数组。然后你可以使用cu来对这个数组进行排序stom compare函数,该函数在元素.v1
上进行比较。最后,您将按v1
对元素进行排序,您将能够得到与v1元素相对应的v2和v3。您不能在其定义中分配结构的成员。它仅在C++11
@user3287789中有效:如果元素的数量足够,则气泡排序可以ts小于大约10。否则,否:随着元素数量的增加,bubblesort的时间呈指数级增长。@user3287789:我不确定bubble排序与这个问题具体有什么关系。您可以使用任何排序算法来实现这两种方法。bubble排序是否糟糕完全是另一回事。
p = { 5, 1, 4, 0, 3, 2 }