通常排序结构对象数组很容易。考虑一个结构数组(AOS)
#define ITEMS 10
typedef struct MyStruct
{
char a;
int b;
}tMyStruct;
tMyStruct arr_mystruct[ITEMS];
我首先填充这个结构数组,其值为< a,b>对。
如果我现在想根据整数字段对这个结构数组进行排序,我可以使用libc qsort函数通过使用带有两个整数参数的比较函数来完成它。
现在考虑用AAS格式替换AOS格式的上述结构
#define ITEMS 10
typedef struct MyStruct
{
char a[ITEMS];
int b[ITEMS];
}tMyStruct;
tMyStruct mystruct;
现在我仍然可以使用qsort对整数b字段数组进行排序,但是这次我需要另外排序一个(字符数组)w.r.t b的排序顺序。
所以我的问题是,对于以SOA格式而不是通常的AOS格式进行数据排序的可能有效方法是什么?
任何人都可以帮我吗?谢谢!
答案 0 :(得分:0)
可能最好的方法是使用辅助数组:
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.a
和mystruct.b
。
请注意,这不如排序“struct of array”那样有效。我不知道你的应用程序,但我的猜测是“数组的结构”,其中数组的字段相关并不是一个好主意。也就是说,如果b
的排序影响a
的排序,它们可能属于同一个概念元素(如果需要,可以将其称为类),如果将它们组合在一个struct
中则更好。{ 1}}。
答案 1 :(得分:0)
除了帮助器建议之外,没有办法用qsort()来做到这一点。对于这样的情况,我会编写自己的排序函数。为了实现速度和易于编写的最佳平衡,我发现Insertion Sort适用于小型数组,Merge Sort适用于大型数组。