根据第一列对二维数组排序 [英] sorting 2-d array based on the first column
问题描述
我有一个temp2.dat
文件,如下所示:
I have a temp2.dat
file that looks like this:
0.060493 1 0.5 1
1.596961 0 0.1 2
0.87758 1 0.3 1.5
0.165453 1 0 3
0.07085 1 0.3 4
0.125379 1 0.2 3
0.454202 1 0.2 2
0.373227 1 0.3 1
0.131486 1 0.3 3
0.867477 0 0.5 4
0.122609 0 0.8 9
现在,我想在C
中编写函数,以仅以第一列的值为基础对这4列进行升序排序.我尝试修改以下代码,但失败:
Now I want to write the function in C
to sort these 4 columns in an increasing order but only based on the values of the first column. I tried modifying the following code but it failed:
struct data_t
{
double x;
int y;
double z;
double k;
};
int compare(const void *a, const void *b)
{
const struct data_t *m = a;
const struct data_t *n = b;
if(m->x == n->x)
return m->y > n->y;
return m->z > n->z;
return m->k > n->k;
return m->x > n->x;
}
有人可以帮我做这个吗?预期结果应如下所示:
Could someone please help me do this? The expected result should look like this:
0.060493 1 0.5 1
0.07085 1 0.3 4
0.122609 0 0.8 9
0.125379 1 0.2 3
0.131486 1 0.3 3
................
0.87758 1 0.3 1.5
1.596961 0 0.1 2
推荐答案
尝试此比较功能
int compare(const void *a, const void *b)
{
const struct data_t *m = a;
const struct data_t *n = b;
if(m->x != n->x)
return (m->x > n->x) - (m->x < n->x);
if(m->y != n->y)
return m->y - n->y;
if(m->z != n->z)
return (m->z > n->z) - (m->z < n->z);
if(m->k != n->k)
return (m->k > n->k) - (m->x < n->k);
return 0;
}
这将比较第一列x
.如果两个元素中的x
相同,它将移至第二列y
.如果第二列相同,则移至第三列,依此类推.
This will compare the first column x
. If x
is the same in the two elements, it moves to the second column y
. If the second column is the same, it moves to the third column and so on.
我们想要两个值之间的差异.例如,m->y - n->y
.比较函数应返回整数值0,负数或正数.
We want the difference between the two values. Example, m->y - n->y
. The compare function should return an integer value 0, negative, or positive.
比较double
值时,我们不能使用m->x - n->x
,因为compare
的返回值为int
.我们改用比较功能.
When comparing double
values, we cannot use m->x - n->x
, because the return value for compare
is int
. We use a comparison function instead.
测试
struct data_t
{
double x;
int y;
double z;
double k;
};
int compare(const void *a, const void *b)
{
const struct data_t *m = a;
const struct data_t *n = b;
if(m->x != n->x)
return (m->x > n->x) ? 1 : -1;
if(m->y != n->y)
return m->y - n->y;
if(m->z != n->z)
return (m->z > n->z) ? 1 : -1;
if(m->k != n->k)
return (m->k > n->k) ? 1 : -1;
return 0;
}
int main(void)
{
struct data_t data[] =
{
{ 0.060493, 3, 0.4, 7 },//1st column is the same
{ 0.060493, 2, 0.5, 8 },
{ 0.060493, 1, 0.6, 9 },
{ 0.060493, 3, 0.3, 4 },//1st & 2nd columns are the same
{ 0.060493, 3, 0.2, 5 },
{ 0.060493, 3, 0.1, 6 },
{ 0.060493, 1, 0.5, 3 },//1st & 2nd & 3rd columns are the same
{ 0.060493, 1, 0.5, 2 },
{ 0.060493, 1, 0.5, 1 },
{ 0.122609, 0, 0.8, 9 },
{ 0.125379, 1, 0.2, 3 },
{ 0.131486, 1, 0.3, 3 },
};
int count = sizeof(data) / sizeof(data[0]);
qsort(data, count, sizeof(data[0]), compare);
for(int i = 0; i < count; i++)
{
printf("%.6f %d %.1f %.0f\n",
data[i].x, data[i].y, data[i].z, data[i].k);
}
return 0;
}
输出:
0.060493 1 0.5 1
0.060493 1 0.5 2
0.060493 1 0.5 3
0.060493 1 0.6 9
0.060493 2 0.5 8
0.060493 3 0.1 6
0.060493 3 0.2 5
0.060493 3 0.3 4
0.060493 3 0.4 7
0.122609 0 0.8 9
0.125379 1 0.2 3
0.131486 1 0.3 3
这篇关于根据第一列对二维数组排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!