我有一个temp2.dat
文件,如下所示:
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列进行排序,但仅基于第一列的值。我尝试修改以下代码但失败了:
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;
}
有人可以帮我这么做吗?预期结果应如下所示:
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
答案 0 :(得分:1)
尝试此比较功能
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
。如果第二列相同,则移动到第三列,依此类推。
我们想要两个值之间的差异。例如,m->y - n->y
。 compare函数应返回整数值0,负数或正数。
比较double
值时,我们无法使用m->x - n->x
,因为compare
的返回值为int
。我们使用比较函数。
测试
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
答案 1 :(得分:0)
首先,在C中如果你想在任何一个区块内有多个语句,你必须用{
和}
包围它。所以你的最后3 return
语句永远不会被达到(缩进对编译器来说无关紧要,只对人类而言)。
其次,当您致电return
时,您的代码不会回来。因此,您可以使用嵌套的if
来比较值,以防它们在某些列中相同。类似的东西:
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) {
if (m->y == n->y) {
if (m->z == n->z) {
return m->k > n->k;
}
return m->z > n->z;
}
return m->y > n->y;
}
return m->x > n->x;
}