我想对2 * n矩阵进行排序,在输入中给出n。制作程序以输出矩阵。这是要求:
例如,设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]
表示“新”数组的项i
。
请注意,不使用v [0]。 n小于100000,不等于。
答案 0 :(得分:2)
数组索引从0开始,因此你的cicles必须从0开始
if (z[j] > z[i])
:您要对v
进行排序,但您要比较z
和排序vec
。通过排序vec
并比较z
冒泡排序无法正常工作。您必须使用相同的数组。
答案 1 :(得分:2)
您正在比较z[]
中存储的值,但交换vec
的元素。
因此,当你在begginig时,你有:
i vec z
------------------
1 1 z[1]
2 2 z[2]
3 3 z[3]
...
例如用3交换2
i vec z
------------------
1 1 z[1]
2 3 z[2]
3 2 z[3]
...
vec
和z
之间的映射不正确。
因此,在另一次迭代中,您将再次将z[2]
与z[3]
进行比较,然后您将不得不交换vec
的元素。这就是为什么你至少应该使用z
vec
的元素或z的索引元素
i vec z
------------------
1 1 z[vec[1]] = z[1]
2 3 z[vec[2]] = z[3]
3 2 z[vec[3]] = z[2]
...
添加此功能应该可以解决问题
...
int t = vec[i];
vec[i] = vec[j];
vec[j] = t;
//Add this also when swapping vec
t = z[i];
z[i] = z[j];
z[j] = t;
...