2*n 行列をソートしたいのですが、入力で n が指定されています。行列を出力するプログラムを作成してください。要件は次のとおりです。
- 最初の列は ASC でソートする必要があり、
- 可能であれば、DESC の 2 列目。
たとえば、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行目を「1 2」に変更し、2行目を「3 4」に変更すると、結果も変わりました。
私のコードの問題は何ですか?
追加情報:
z[]
この問題の要件を満たす関数を使用しているため、使用しているため、単純に並べ替えることができます。vec[]
配列の移動には多くの時間がかかる可能性があるため、元のインデックスを保存します。つまりv[vec[i]][0]
、「新しい」配列の item を意味しますi
。v[0] は使用されないことに注意してください。n が 100000 未満で、等しくありません。