dポイントプレゼントキャンペーン実施中!

皆様こんにちは。

ソートについて悩んでおります。
以下の様な表イメージで配列を持っており
(実際は要素数は動的に変わります)

char AAA[10000][20][10]; /*(10000行20列10文字)*/

これを列毎のキーで昇順/降順と並び替えるプログラムを
Cにて実現させたいのですが

検索して調べても2次元はよく載っているのでが、
複数列となるとなかなか無くて、お手上げ状態です。

・qsortは使えない。
・安定するソート法にてやらないといけなさそう
というのはなんとなく理解できるのですが.....

良い方法をご存知の方いらっしゃいましたら、よろしくお願います。

A 回答 (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;
}
という具合に変えればよいわけです。
いくつかの変数は配列に変更します。構造体にする手もあります。
    • good
    • 0
この回答へのお礼

教えていただいた方法で実現することができました。
結果が安定するソート方法を条件回呼んで...って考えて悩んでいたので
こんなあっさりとした方法で実現できるとは...
本当に有難うございました。

お礼日時:2002/05/29 15:59

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列目 昇順
という様な感じで並び替えを
行いたいのです。

補足日時:2002/05/29 14:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!