• ベストアンサー

並べ替えについて教えて下さい

現在、C言語を勉強しています 現在、読み取り用のファイルからデータを読み取って情報を処理し、別のファイルにその結果を書き込むといったことをしています。 その中で、配列変数を用いた並べ替えに悪戦苦闘しています。 数字を並べ替えるのと、文字を並べ替えるのでは方法が違うとのこと。 そもそも、文字を並べ替えるとはどういうことですか? まだ経験が少ないので、できる限りわかりやすく説明して下さい。 (c言語に使用する言語を使われてもかまいません。)

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

  • ベストアンサー
  • cocky
  • ベストアンサー率57% (232/402)
回答No.4

直接の回答ではありませんが、KOH_daさんのプログラム例だとまずい点があるので、念のため指摘しときます。 数値の入れ替えの方はそのままでもいいんですが、文字列の方は必ずしも文字列の記憶領域が十分確保されているとは限りませんから、単にポインタを入れ替えるにとどめるか、もしくはきちんとmalloc/freeしないとだめですよね。 なので、前者(ポインタをただ入れ替えるだけ)なら、 if( strcmp( a[i], a[j] ) > 0 ) {  w = a[i];  a[i] = a[j];  a[j] = w; } でしょうし、また後者(完全にmalloc/freeしなおす)なら if( strcmp( a[i], a[j] ) > 0 ) {  w = malloc( strlen( a[i] ) + 1 );  strcpy( w, a[i] );  realloc( a[i], strlen( a[j] ) + 1 );  strcpy( a[i], a[j] );  realloc( a[j], strlen( w ) + 1 );  strcpy( a[j], w );  free( w ); } と書かないと、最悪の場合配列の他の部分の文字列が破壊されるなど大変なことになります。 しかも後者の場合だと、今回はあえて省略しましたが、malloc/reallocに失敗した場合のエラー処理まで考えると処理が非常に重くなります。 なので、前者のような書き方がベストでは、と思いますが。

kouzi
質問者

お礼

質問が抽象的だったようですね。すみませんでした。 とても詳しく説明していただいてありがとうございました。

その他の回答 (3)

  • KOH_da
  • ベストアンサー率31% (161/506)
回答No.3

答えじゃなくて、問題の意味を聞かれても推測でしか答えられません。 たぶん文字を並べ替えるというのは、 文字列を並べ替えるという意味だと思います。 名前を五十音順にするとか...。 で、方法が違うというのはこういうことじゃないかな。 数字の並べ替えだと... if( a[i] < a[j] ) { w = a[i]; a[i] = a[j]; a[j] = w; } というように並べ替えることができます。 しかし文字列だとそのまま比較することができませんし、 代入にも専用の関数が必要になります。 if( strcmp(a[i], a[j]) > 0 ) { strcpy( w, a[i] ); strcpy( a[i], a[j] ); strcpy( a[j], w ) ; }

kouzi
質問者

お礼

質問が抽象的だったようですね。すみませんでした。 参考になりました。ありがとうございました。

  • cocky
  • ベストアンサー率57% (232/402)
回答No.2

正確には「文字を並べ替える」ではなく、「文字列を辞書順に並べる」と表現すると意味が通じると思います。 基本的には数値同士の比較であれば、単純にif文等で比較してやればいいんですが、文字列同士の比較の場合はstrcmp関数を使うのが普通です。 ただし、strcmp関数はあくまで8bitコード(半角英数字、半角カナ)の文字列で利用されることを前提としているため、漢字混じり文字列(つまりマルチバイトコード)の場合はwcscmp関数などを使う必要があります。 また漢字を扱う場合はそのコード体系(JIS、Shift-JIS、EUC)の違いにも注意する必要があり、特に比較や並べ替えを行う場合は事前に漢字コードを何らかの形で統一しておかないと、訳の分からない結果がでてくる原因につながります。 今制作中というプログラムが具体的にどこまでの処理を予定しているのかがわからないのでこれ以上の回答は難しいですが…。

kouzi
質問者

お礼

わかりやすい回答ありがとうございました。 質問が抽象的だったようですね。すみませんでした。

回答No.1

ここで並べ替えとは、どういう処理をさしているのでしょうか? ソーティング(整列)ですか?そうだと仮定して… 「方法が違うとのこと」とされていますが、整列そのものの原理は、 対象が何であれ変わるわけではありません。数値と文字列(文字で はなくて文字列ですよね?)で違うのは、代入するのに = を使う か strcpy 等を使うかの違いと、比較するのに <, =, > を使うか、 strcmp 等を使うかの違いです。もっとも、文字列の比較の場合、 何を大きいとするかは目的によって違いますので、特殊な順序にし たいなら新たに関数を用意しなければいけません。

関連するQ&A