![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
皆様こんにちは。
ソートについて悩んでおります。
以下の様な表イメージで配列を持っており
(実際は要素数は動的に変わります)
char AAA[10000][20][10]; /*(10000行20列10文字)*/
これを列毎のキーで昇順/降順と並び替えるプログラムを
Cにて実現させたいのですが
検索して調べても2次元はよく載っているのでが、
複数列となるとなかなか無くて、お手上げ状態です。
・qsortは使えない。
・安定するソート法にてやらないといけなさそう
というのはなんとなく理解できるのですが.....
良い方法をご存知の方いらっしゃいましたら、よろしくお願います。
No.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;
}
という具合に変えればよいわけです。
いくつかの変数は配列に変更します。構造体にする手もあります。
教えていただいた方法で実現することができました。
結果が安定するソート方法を条件回呼んで...って考えて悩んでいたので
こんなあっさりとした方法で実現できるとは...
本当に有難うございました。
No.1
- 回答日時:
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列目 昇順
という様な感じで並び替えを
行いたいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Excel(エクセル) Excelの50音順ソートを全ての行列に適用するには? 4 2022/12/05 11:28
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Excel(エクセル) 重複しているか否かをソートせずに判断する方法ありますか? 2 2022/07/06 21:16
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- Java Java 南京錠 2 2023/02/04 11:46
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) Excelのソート(並べ替え) 2 2022/05/15 22:54
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
「指定されたキャストは有効で...
-
(int *)の意味
-
16進数の計算の仕方を教えて下さい
-
任意の文字列のアルファベット...
-
毎回違う乱数を生成するにはど...
-
PowerShellがうまくいかない
-
構造体の勉強中です 合計点の高...
-
ポストの対応問題
-
数字列を3桁ごとにカンマで区切...
-
C言語の基礎 . 2乗値の差につ...
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
C言語
-
C言語のサイコロシミュレート
-
キーボードから自然数を入力し...
-
最早開始時間と最遅完了時刻を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
へんな現象
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
if と配列の組み合わせ
-
C言語での奇数の和
-
C言語 配列と関数の練習問題
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
C言語
-
実数の整数部,小数部の取得
-
足して100になるような乱数のア...
-
卒業研究でよく分からないとこ...
-
数字列を3桁ごとにカンマで区切...
-
c言語
-
std::set<int> で、ある値が何...
-
比較回数と交換回数表示について
おすすめ情報