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实现,并对其进行修改,以在比较函数之外接受一个附加的交换函数


通过这种方式,您可以交换所有并行数据中的项。

在必须对多个独立数据结构执行同步重新排列的情况下,您可以采用以下两种方法之一:

  • @wallyk提到的一种侵入性“内部”方法,即提供您自己的交换功能,将同步交换所有三个阵列中的元素
  • 一种非侵入性的“外部”方法-将排序过程分解为两个独立的步骤:首先,从“主”数组生成排序排列,然后将排序排列独立应用于三个数组中的每一个
  • 第一种方法可能更容易实现,但它有一些明显的缺点。随着数据集数量的增加和/或元素本身变得更重,交换函数也变得更重。这对于基于元素物理复制的排序算法来说不是一件好事,因为这类算法可能会重新定位(交换)每个元素不止一次

    第二种方法本质上基于间接的索引排序,这意味着它对元素复制的程度不太敏感。第二种方法只复制每个实际元素一次,当它知道其最终位置时

    要生成排序排列,您需要做的就是使用
    {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 }