- ベストアンサー
文字列3次元配列のソート(複数キー)について教えてください
- 文字列3次元配列のソート(複数キー)について教えてください。C言語を使用して、列ごとにキーで昇順または降順に並び替える方法を知りたいです。
- 現在、文字列の3次元配列をソートする方法について悩んでいます。配列は10000行20列10文字で構成されており、C言語を使用して実現したいです。qsortは使用できず、安定したソート方法が必要です。
- 文字列の3次元配列を列ごとにキーで昇順または降順に並び替える方法について教えてください。現在、C言語でこの問題に取り組んでおり、qsort以外の安定したソートアルゴリズムを探しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 複数の列に対しソートの条件を与えれるという事です。 比較関数の内容を変えるだけの話で済むことだと思います。 例えば、前の回答のCompareを int compare(char *data1, char *data2) { int offset; int i; int result = 0; for (i=0 ; (result==0) && (i<keyNumber) ; i++) { offset = keyColumn[i] * stringLength; result = strncmp(data1+offset, data2+offset, stringLength) * (incremental[i]?1:-1); } return result; } という具合に変えればよいわけです。 いくつかの変数は配列に変更します。構造体にする手もあります。
その他の回答 (1)
- ranx
- ベストアンサー率24% (357/1463)
qsortでもいいんじゃないでしょうか。 要素数の動的な変化をどう実現するかにもよりますが、 例えば int recordNumber = 10000; int columnNumber = 20; int stringLength = 10; int keyColumn; int incremental; // 1:昇順 0:降順 int compare(char *data1, char *data2) { int offset = keyColumn * stringLength; return strncmp(data1+offset, data2+offset, stringLength) * (incremental?1:-1); } main() { char *AAA; AAA = malloc(recordNumber*columnNumber*stringLength); // この間AAAにデータをセット keyColumn = 5; // キー列を5とした場合 incremental = 1; // 昇順の場合 qsort(AAA, recordNumber, (columnNumber*stringLength, compare); }
補足
早速のご回答有難うございます。 申し訳ないです。質問が説明不足でした。 補足させていただきます。 >これを列毎のキーで昇順/降順と並び替えるプログラムを >Cにて実現させたいのですが 複数の列に対しソートの条件を与えれるという事です。 例: 第1キー:1列目 昇順 第2キー:5列目 降順 第3キー:3列目 昇順 という様な感じで並び替えを 行いたいのです。
お礼
教えていただいた方法で実現することができました。 結果が安定するソート方法を条件回呼んで...って考えて悩んでいたので こんなあっさりとした方法で実現できるとは... 本当に有難うございました。