我不是 C 专家,我已经通读了论坛,但我仍然需要一些关于 C 排序问题的建议。
我在 C 中有 4 个 double 动态数组。它们的大小都相同,假设为 n。我想要做的是使用其中一个数组作为第一顺序,使用第二个数组作为我的第二顺序对所有这些进行排序。因此,如果数组是 *x、*y、*w 和 *z。我想根据 *x 的值对它们进行排序,然后是 *y。
我必须高效地执行此操作,因为数组非常大。
任何帮助将不胜感激。
最佳答案
执行此操作的简单方法是将四个单独的数组映射到一个结构类型的数组,例如
struct rec {
double x;
double y;
double w;
double z;
};
struct rec *arr = malloc( sizeof *arr * N ); // where N is the number of
// elements in each array
if ( !arr )
// malloc failed, handle error somehow
for ( size_t i = 0; i < N; i++ )
{
arr[i].x = x[i];
arr[i].y = y[i];
arr[i].w = w[i];
arr[i].z = z[i];
}
然后创建一个比较函数传递给qsort
:
int cmpRec( const void *lhs, const void *rhs )
{
struct rec *l = lhs;
struct rec *r = rhs;
if ( l->x < r->x )
return -1;
else if ( l->x > r->x )
return 1;
else
{
if ( l->y < r->y )
return -1;
else if ( l->y > r->y )
return 1;
else
return 0;
}
return 0;
}
现在您可以使用qsort
库函数对该结构数组进行排序:
qsort( arr, N, sizeof *arr, cmpRec );
对该数组排序后,您可以将结果映射回您的四个原始数组。
关于c - C中的数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115268/