繁体   English   中英

使用qsort对数组进行排序

[英]Sorting structure of arrays with qsort

通常排序结构对象的数组很容易。 考虑一个结构数组(AOS)

#define ITEMS 10

typedef struct MyStruct
{
 char a;
 int  b;
}tMyStruct;

tMyStruct arr_mystruct[ITEMS];

我首先用<a,b>对的值填充这个结构数组。

如果我现在想根据整数字段对这个结构数组进行排序,我可以使用libc qsort函数通过使用带有两个整数参数的比较函数来实现。

现在考虑我用SOA格式替换AOS格式的上述结构

#define ITEMS 10

typedef struct MyStruct
{
 char a[ITEMS];
 int  b[ITEMS];
}tMyStruct;

tMyStruct mystruct;

现在我仍然可以使用qsort对整数b字段的数组进行排序,但是这次我需要另外对b的排序顺序排序(字符数组)。

所以我的问题是,对于以SOA格式而不是通常的AOS格式排列的数据进行排序的可能有效方法是什么?

谁能帮我这个 ? 谢谢!

可能最好的方法是使用辅助数组:

int helper[ITEMS];

int helper_cmp(const void *a, const void *b);

for (i = 0; i < ITEMS; ++i)
    helper[i] = i;
qsort(helper, ITEMS, sizeof(*helper), helper_cmp);

helper_cmp函数将helper值作为mystruct.b索引并比较这些值:

int helper_cmp(const void *a, const void *b)
{
    int first = *(const int *)a;
    int second = *(const int *)b;
    int b_first = mystruct.b[first];
    int b_second = mystruct.b[second];
    // compare b_first and b_second
}

然后,在qsort ,辅助数组将包含重新排列的b索引,告诉它应该如何排序。

您可以使用此数组重新排列mystruct.amystruct.b


请注意,这不如排序“struct of array”那样有效。 我不知道你的应用程序,但我的猜测是“数组的结构”,其中数组的字段相关并不是一个好主意。 也就是说,如果选b影响的分类a ,他们可能属于同一个概念元素(调用它,如果你想通过这门课),它是更好,如果他们在一个组合在一起struct

除了帮助器建议之外,没有办法用qsort()来做到这一点。 对于这样的情况,我会编写自己的排序函数。 为了实现速度和易于编写的最佳平衡,我发现Insertion Sort适用于小型数组,Merge Sort适用于大型数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM