-PR-
解決
済み

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

  • 暇なときにでも
  • 質問No.45862
  • 閲覧数268
  • ありがとう数7
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 47% (49/103)

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

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

  • 回答No.4
レベル12

ベストアンサー率 57% (232/402)

直接の回答ではありませんが、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

お礼率 47% (49/103)

質問が抽象的だったようですね。すみませんでした。
とても詳しく説明していただいてありがとうございました。
投稿日時 - 2001-03-16 10:56:32
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル11

ベストアンサー率 55% (155/280)

ここで並べ替えとは、どういう処理をさしているのでしょうか? ソーティング(整列)ですか?そうだと仮定して… 「方法が違うとのこと」とされていますが、整列そのものの原理は、 対象が何であれ変わるわけではありません。数値と文字列(文字で はなくて文字列ですよね?)で違うのは、代入するのに = を使う か strcpy 等を使うかの違いと、比較するのに <, =, > を使うか、 s ...続きを読む
ここで並べ替えとは、どういう処理をさしているのでしょうか?
ソーティング(整列)ですか?そうだと仮定して…

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


  • 回答No.2
レベル12

ベストアンサー率 57% (232/402)

正確には「文字を並べ替える」ではなく、「文字列を辞書順に並べる」と表現すると意味が通じると思います。 基本的には数値同士の比較であれば、単純にif文等で比較してやればいいんですが、文字列同士の比較の場合はstrcmp関数を使うのが普通です。 ただし、strcmp関数はあくまで8bitコード(半角英数字、半角カナ)の文字列で利用されることを前提としているため、漢字混じり文字列(つまりマルチバイトコー ...続きを読む
正確には「文字を並べ替える」ではなく、「文字列を辞書順に並べる」と表現すると意味が通じると思います。

基本的には数値同士の比較であれば、単純にif文等で比較してやればいいんですが、文字列同士の比較の場合はstrcmp関数を使うのが普通です。
ただし、strcmp関数はあくまで8bitコード(半角英数字、半角カナ)の文字列で利用されることを前提としているため、漢字混じり文字列(つまりマルチバイトコード)の場合はwcscmp関数などを使う必要があります。
また漢字を扱う場合はそのコード体系(JIS、Shift-JIS、EUC)の違いにも注意する必要があり、特に比較や並べ替えを行う場合は事前に漢字コードを何らかの形で統一しておかないと、訳の分からない結果がでてくる原因につながります。

今制作中というプログラムが具体的にどこまでの処理を予定しているのかがわからないのでこれ以上の回答は難しいですが…。
お礼コメント
kouzi

お礼率 47% (49/103)

わかりやすい回答ありがとうございました。
質問が抽象的だったようですね。すみませんでした。
投稿日時 - 2001-03-16 10:59:08
  • 回答No.3
レベル12

ベストアンサー率 31% (161/506)

答えじゃなくて、問題の意味を聞かれても推測でしか答えられません。 たぶん文字を並べ替えるというのは、 文字列を並べ替えるという意味だと思います。 名前を五十音順にするとか...。 で、方法が違うというのはこういうことじゃないかな。 数字の並べ替えだと... if( a[i] < a[j] ) { w = a[i]; a[i] = a[j]; a[j] = w; } ...続きを読む
答えじゃなくて、問題の意味を聞かれても推測でしか答えられません。
たぶん文字を並べ替えるというのは、
文字列を並べ替えるという意味だと思います。
名前を五十音順にするとか...。

で、方法が違うというのはこういうことじゃないかな。
数字の並べ替えだと...
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

お礼率 47% (49/103)

質問が抽象的だったようですね。すみませんでした。
参考になりました。ありがとうございました。
投稿日時 - 2001-03-16 10:57:50
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ