質問: 2次元配列で2項目についてソートのやりかたについて こんにちは. vs2005 c++ mfc ダイアログベースでソフトを作成しています. cstring型の配列 array[100000][3] を定義し, csvファイルから読み込んだ値を格納しています. 1列目 x座標 2列目 y座標 3列目 結果 ファイルから読み込んだデータは以下のように y優先でxとyの値で昇順に並んでいます. _____[0] [1] [2] [0] 200 100 ok [1] 201 100 ok [2] 202 100 ok [3] 200 101 ng [4] 201 101 ok [5] 202 101 ok [6] 201 102 ng [7] 202 102 ok ... これを以下のように x優先でxとyの値で昇順に並び変えたいのですが どのようにすればよいでしょうか? _____[0] [1] [2] [0] 200 100 ok [1] 200 101 ng [2] 201 100 ok [3] 201 101 ok [4] 201 102 ng [5] 202 100 ok [6] 202 101 ok [7] 202 102 ok かつ,100000行もあるのでスピードが速い方法だと助かります. 具体的なコードもお願いいたします.
回答: c言語的な考え方ですが、私なら以下のように作成します。 array[100000][3]に対応する配列を2つ用意しましょう。 ここでは tmp[10000],idx[10000]とします。 x,y座標がどの程度の大きさになるのか?次第ですが、例にあるように 3桁数字程度であれば、tmp[],idx[]はint型で以下のように設定します。 tmp[x]=atoi(array[x][0])<<16+atoi(array[x][1]) idx[x]=x tmp[x]を並べ替え、その結果をidx[x]にも反映させれば、array[idx[x]][3]とすることで 並べ替えられたことになります。 高速化のポイントは 比較はcpuが扱うことができる最も得意なデータで あるint型を用いることです。 もし例と異なり、数値が3桁整数でない、もしくは小数点含むデータで あるなら素直にice_falconさんが提示されている方法がいいかと思います。