- ベストアンサー
添字の対応関係を維持したい
a[0][0]=100, a[1][0]=30, a[2][0]=50, a[0][1]=200 a[1][1]=20, a[2][1]=10, a[0][2]=110, a[1][2]=60, a[2][2]=80となっていた場合に、これをソートして、 b[0][0]=10, b[1][0]=20, b[2][0]=30, b[0][1]=50 b[1][1]=60, b[2][1]=80, b[0][2]=100, b[1][2]=110, b[2][2]=200、としたとします。 ある規則で配列bの値をいじるのですが、その後に、 元の並びに戻したいです。 b[0][2]の値はa[0][0]へ、b[2][0]の値はa[1][0]へ、 といったように、添字の対応関係を維持したいということです。 ソートの方法は結構です。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
添字の対応関係を例えばc1[n][n],c2[n][n]で持っておけばいいように思います。 ソートの時にc1とc2を作っておけば、 a[i][j]=b[c1[i][j]][c2[i][j]] で戻せますね。
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
struct b { int value; int dim1; int dim2; } b[9]; とでもしておけば、 b[0].value=a[0][0]; b[0].dim1=0; b[0].dim2=0; b[1].value=a[1][0]; b[1].dim1=1; b[1].dim2=0; として、ソートして値の変更をして a[b[1].dim1][b[1].dim2]=b[1].value; として戻せます。
- tatsu99
- ベストアンサー率52% (391/751)
>ある規則で配列bの値をいじるのですが、その後に、 >元の並びに戻したいです。 配列bをいじる前に、配列b全体を配列xにバックアップしておけば、良いと思いますが。 もとに戻すときは、配列xを配列bに移送すれば戻ります。もちろん、配列bと配列xの要素の数は、一致させておきます。
補足
説明が下手だったかもしれませんが、配列bの値自体はどうでもよく、ソートして並び変えた順番をまた元の順番に戻したいのです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
このままでは、無理です。 bを構造体にでもして、 元のデータ位置を記憶しておくしかないとないと思います。
補足
bは構造体でも何でもいいです。作業場所に過ぎませんから。
お礼
2次元配列だとこんがらがるので、1次元にしてからソートして、また、2次元に戻すことにしました。 添字用の配列を作って、ソートで入れ替えたときに、添字も入れ替えて保存することでうまくいきました。 参考になりました。ありがとうございます。