根据第一列对二维数组进行排序
sorting 2-d array based on the first column
我有一个 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
首先,在 C 语言中,如果您想在任何块中包含多个语句,则必须用 {
和 }
将其包围。所以你的最后 3 return
语句永远不会被达到(缩进对编译器无关紧要,只对人类有用)。
其次,当你调用return
时,你的代码没有返回。因此,您可以使用嵌套的 if
s 来比较值,以防它们在某些列中相同。类似于:
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;
}
试试这个比较函数
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
。比较函数应 return 整数值 0、负数或正数。
比较double
值时,我们不能使用m->x - n->x
,因为compare
的return值是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
我有一个 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
首先,在 C 语言中,如果您想在任何块中包含多个语句,则必须用 {
和 }
将其包围。所以你的最后 3 return
语句永远不会被达到(缩进对编译器无关紧要,只对人类有用)。
其次,当你调用return
时,你的代码没有返回。因此,您可以使用嵌套的 if
s 来比较值,以防它们在某些列中相同。类似于:
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;
}
试试这个比较函数
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
。比较函数应 return 整数值 0、负数或正数。
比较double
值时,我们不能使用m->x - n->x
,因为compare
的return值是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