基于第一列排序二维数组

我有一个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 

试试这个比较function

 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 

首先,在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; }