文字列3次元配列のソート(複数キー)について教えてください

このQ&Aのポイント
  • 文字列3次元配列のソート(複数キー)について教えてください。C言語を使用して、列ごとにキーで昇順または降順に並び替える方法を知りたいです。
  • 現在、文字列の3次元配列をソートする方法について悩んでいます。配列は10000行20列10文字で構成されており、C言語を使用して実現したいです。qsortは使用できず、安定したソート方法が必要です。
  • 文字列の3次元配列を列ごとにキーで昇順または降順に並び替える方法について教えてください。現在、C言語でこの問題に取り組んでおり、qsort以外の安定したソートアルゴリズムを探しています。
回答を見る
  • ベストアンサー

文字列3次元配列のソート(複数キー)について教えてください

皆様こんにちは。 ソートについて悩んでおります。 以下の様な表イメージで配列を持っており (実際は要素数は動的に変わります) char AAA[10000][20][10]; /*(10000行20列10文字)*/ これを列毎のキーで昇順/降順と並び替えるプログラムを Cにて実現させたいのですが 検索して調べても2次元はよく載っているのでが、 複数列となるとなかなか無くて、お手上げ状態です。 ・qsortは使えない。 ・安定するソート法にてやらないといけなさそう というのはなんとなく理解できるのですが..... 良い方法をご存知の方いらっしゃいましたら、よろしくお願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答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; } という具合に変えればよいわけです。 いくつかの変数は配列に変更します。構造体にする手もあります。

hiroshi2001
質問者

お礼

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

その他の回答 (1)

  • ranx
  • ベストアンサー率24% (357/1463)
回答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); }

hiroshi2001
質問者

補足

早速のご回答有難うございます。 申し訳ないです。質問が説明不足でした。 補足させていただきます。 >これを列毎のキーで昇順/降順と並び替えるプログラムを >Cにて実現させたいのですが 複数の列に対しソートの条件を与えれるという事です。 例: 第1キー:1列目 昇順 第2キー:5列目 降順 第3キー:3列目 昇順 という様な感じで並び替えを 行いたいのです。

関連するQ&A

  • 多次元配列でソートしたい

    たとえば、Yahooオークションとかで、「商品名」「価格」「残り日数」が表示されていて、 それぞれをクリックすると、その列をソートして全体を昇順・降順に並べ替えてくれますよね。 あれを自前のCGIで実現したいのです。 たとえば、3次元配列$hoge[X][Y][Z]を定義し、ここがクリックされたらXをキーにソート、ここがクリックされたらYでソートということをやりたいと思っているのですが、当然こういう機能は無いわけで、自分で作らなくてはいけません。 連想配列とかポインタとか色々考えたのですが、うまく行かず・・・。 どのような実装方法があるでしょうか、アイデアをお聞かせ願えたら嬉しいです。

    • ベストアンサー
    • Perl
  • 二次元配列でソートがしたい

    二次元配列でソートがしたい 二次元配列でソートがしたい 開発環境:Visual Web Developer 2008 express 言語:Visual Basic 上記開発環境でWebアプリケーションを開発中です。 TextBoxを縦20行横10列の表形式に配置し、左から2番目の列に入力された数値をキーに、昇順に並べ替えができるような入力フォームを作成していますが、参考になるようなサイトが見つからなかったので、どなたか参考になるサイトやサンプルロジックを教えて頂けないでしょうか? よろしくお願いします。

  • Pythonの2次元配列のソート

    Python3の2次元配列のソートについて教えて下さい [[1, 2], [1, 3], [2, 4]]のようなリストのソートで 昇順ソートでインデックス0が同じならインデックス1は降順でソートしたいと思ってます。 結果が以下のようになるようにしたいです 1 3 1 2 2 4 よろしくおねがいします。

  • 2次元配列 ソート

    はじめまして。 FLASH8を使っています。 2次元配列のソートがうまくいかず困っています。 Array[0][0] = "かかか"; Array[0][1] = "ききき"; Array[0][2] = "くくく"; Array[1][0] = "あああ"; Array[1][1] = "いいい"; Array[1][2] = "ううう"; とあって2番目の要素(「ききき」「いいい」の部分です)をキーとしてArray[n]を昇順にソートしたいのです。 この場合結果としては、 Array[0][0] = "あああ"; Array[0][1] = "いいい"; Array[0][2] = "ううう"; Array[1][0] = "かかか"; Array[1][1] = "ききき"; Array[1][2] = "くくく"; となります。 ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • 二次元配列のソート PHP

    タイトルのとおりソートを行ってくれる関数を探しております。 $buf[][]の二次元配列の変数を日付の降順に並べ替えたいのですが、そういった関数は用意されていますか? sort()、rsort()では不可能かと思います。 以下、二次元配列の値です。配列三番目の日付の降順で再格納したいです。 ( [0] => Array ( [0] => 1[1] => name1 [2] => 2006-08-18 ) [1] => Array ( [0] => 2 [1] => name2[2] => 2006-08-28 ) [2] => Array ( [0] => 3[1] => name3 [2] => 2006-08-18 ) [3] => Array ( [0] => 4 [1] => name4[2] => 2006-08-18 ) よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Fortran77で多次元配列を並び替え(ソート)する方法

    Fortran77のプログラミングを勉強しています。 多次元配列の並び替えをする時に、各行の組み合わせを変えずにある列に含まれる要素についてソートを行いたいのですが、やり方が分かりません。どなたか方法を教えてくださいますでしょうか。 例えば、 (1,1)A,(1,2)あ,(1,3)3 (2,1)B,(2,2)い,(2,3)1 (3,1)C,(3,2)う,(3,3)2 という3×3の配列を読み込み、3列目を昇順に並べ替えて、 (1,1)B,(1,2)い,(1,3)1 (2,1)C,(2,2)う,(2,3)2 (3,1)A,(3,2)あ,(3,3)3 とした上で、別のファイルに出力したいのです。 初歩的な質問で恐縮ですが、どなたかご教授よろしくお願い致します。

  • 多次元配列のソートについて

    名前とテストの点, クラスが格納されている 以下のような多次元配列があるとします。 $data[0][0] = 'yamada'; $data[0][1] = '20'; $data[0][2] = 'B'; $data[1][0] = 'katoh'; $data[1][1] = '45'; $data[1][2] = 'A'; $data[2][0] = 'honda'; $data[2][1] = '15'; $data[2][2] = 'E'; $data[3][0] = 'ooyama'; $data[3][1] = '100'; $data[3][2] = 'C'; 上記の配列を得点順にソートして表示したいのですが どのようにすればうまく(昇順、降順)で表示できるのでしょうか?

    • 締切済み
    • PHP
  • 2次元配列のソート

    2次元配列のデータをソートしたいのですが方法がわかりません。初歩的な質問ですが、ご存知の方、よろしくお願いいたします。 (例) 商品コード、商品名、金額、有効期限のデータを以下のように持っています。 $data[0] = ("001", "商品A", 5200, "2004/5"); $data[1] = ("002", "商品B", 350, "2005/1"); $data[2] = ("003", "商品C", 10800, "2004/3"); ・・・・ データの項目(商品コード、商品名など)数は固定ですが、データ数、内容は変化します。 2次元配列でデータがあり、商品コードで降順にソート、金額で昇順にソートなどのソートを行う方法はありますか? No.760468 で同じような質問があり、array_multisort が回答としてあがっていましたが、上記データの場合ソートできないようなので質問させていただきました。 なお、環境によりデータベースを使用することはできません。

    • ベストアンサー
    • PHP
  • 配列のソートがしたい

    sort関数等調べたのですがうまくできません。 やりたいことは http://q.hatena.ne.jp/1155090363 ↑で見つけた事とそっくりなのですが・・・。 ------------------------------------------- arrItem[n] という配列の一つの要素の中に、 タブで区切られた10個程のデータが入っています。 arrItem[0] = "5 ^ 店名5 ^ 品名5 ^ 価格5 ^ 割引額5 ^・・・^ 備考5" arrItem[1] = "2 ^ 店名2 ^ 品名2 ^ 価格2 ^ 割引額2 ^・・・^ 備考2" arrItem[2] = "11 ^ 店名9 ^ 品名9 ^ 価格9 ^ 割引額9 ^・・・^ 備考9" 一列目はSEQ番号でユニークですが、順番が並んでいません。 この配列をSEQ番号で並べ替えたいのですが、 sortだと文字列比較のためか桁数の違う数字の並べ替えが 上手くできません。数値としてのソート方法 が分かる方いらっしゃいましたらご教授願います。 もし可能なら、1列目を数値降順にしたり昇順にしたり、 また2列目を五十音順にソートしたり、 また4列目を価格の安い順にソートしたり と応用も可能ならばご教授願いたいです。 宜しくお願い致します。

  • 配列のソート

    Ruby初心者です。 例えば [12,38,121,273,13] [23,47,478,112,98] [56,73,227,556,12] [22,43,668,223,74] [33,13,393,763,91] を [12,38,121,273,13] [22,43,668,223,74] [23,47,478,112,98] [33,13,393,763,91] [56,73,227,556,12] のように第1列目の要素で配列ごとソートしたいのですが、私がやると、 [12,13,38,121,273] [22,43,74,223,668] [23,47,98,112,478] [13,33,91,393,763] [12,56,73,227,556] のように第一列の要素は一応ソートは出来ているのですが、 配列の中身まで並べ変わってしまいます。 配列ごとにソートするにはどうすれば良いのでしょうか?

専門家に質問してみよう