基于第一列排序二维数组
我有一个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; }