我想对一个 2*n 矩阵进行排序,n 在输入中给出。编写一个程序来输出一个矩阵。这是要求:
- 第一列必须按 ASC 排序,并且
- 如果可能,DESC 中的第二列。
例如,设 n = 5,则矩阵为
3 4
1 2
3 5
1 6
7 3
结果应该是
1 6
1 2
3 5
3 4
7 3
所以我写下这样的代码。第一行输入值 n,接下来的行如上。
#include <stdio.h>
#define TWO_16 65536
#define TWO_15 32768
int v[100000][2];
int z[100000];
int vec[100000];
int n;
int main()
{
int i, j;
scanf ("%d", &n); // give the value of n;
for (i = 1; i <= n; i++) // filling the matrix;
{
scanf ("%d%d", &v[i][0], &v[i][1]);
z[i] = TWO_16 * v[i][0] + TWO_15 - v[i][1];
vec[i] = i;
}
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
{
if (z[j] > z[i])
{
int t = vec[i];
vec[i] = vec[j];
vec[j] = t;
}
}
for (i = 1; i <= n; i++) // output the matrix
printf("%d %d\n",v[vec[i]][0],v[vec[i]][1]);
return 0;
}
但是在 gcc 中,输出是
1 6
3 5
3 4
1 2
7 3
更重要的是,当输入的第一行改为“1 2”,第二行改为“3 4”时,结果也发生了变化。
我的代码有什么问题?
附加信息:
我使用z[]
是因为我使用了一个满足这个问题要求的函数,所以我可以简单地对它们进行排序。并vec[]
存储原始索引,因为移动数组可能会花费大量时间。所以v[vec[i]][0]
意味着“新”数组的 item i
。请注意,不使用 v[0]。n 小于 100000,不等于。