• ベストアンサー

数字文字列のソート方法

文字列に数字を含むデータのソートを行うプログラムを C言語で作成したいのですが、どうすれば良いでしょうか? 具体的に言うと、a12、a2、a10という順序で並んでいる データを昇順にソートした場合にa10、a12,a2というように ソートせず、ちゃんとa2,a10,a12とソートされるように したいのですが、簡単にできるものでしょうか? 質問がわかりにくいかもしれないのですが、どうかご回答をお願いします。

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.4

a1b12c6 a15b6 a1b12c3 a1b2...z26 こんな状況でしょうか。 ソートアルゴリズムを選択するときの基本は「データ数」と「キーの性質」、「未ソート状態のデータ並び」を把握することです。 場合によっては「第1キー~第nキーを使って全データを対象に一気にソートする」ことが正しい場合もあります。 ことによると「上位キーが同一値であったデータだけを対象として再帰的に部分ソートを繰り返す」ことが最良の場合があります。

t_u2t_u2
質問者

お礼

どうもありがとうございます。大変参考になりました。 これを踏まえてもう少し考えて作成してみたいと思います。

その他の回答 (3)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

こういう「ちょっとややこしいデータ構成」にぶつかった場合は「データ構造の一般化」を試みます。 この場合、『数字以外の文字列』と『数字列』が連結されており、全体が'\0'で終結している文字列です。 と、言うことは2つの部分を分割すれば話は単純になります。 1.数字以外の文字列 2.数字列を数値化したもの より簡単にするには構造体で置き換えた方が良いでしょう。 文字列から数字列の先頭を取り出すにはstrpbrk()を使うと簡単です。 char *strpbrk(char *str, char *accept); 対象の文字列をstrに、探すべき文字の集合(この場合'0'~'9')をacceptに指定します。 戻り値はacceptにある文字が見つかった最初のアドレスまたはNULL(見つからなかった)です。 だから、 #define ACCEPT "0123456789" struct TAG { char str[文字列の最大長+1]; int val ; } tabl[データ数] ;/* <-ソート対象のテーブル */ char *pp ; この状態でループして strcpy(table[ii].str, data[ii]) ; if ((pp = strpbrk(table[ii].str, ACCEPT)) == NULL) { /* 数字無し */ table[ii].val = 0 ; } else { /* 数字あり */ table[ii].val = atoi(pp) ; *pp = '\0' ; } を実行すれば『文字列』と『数値』に分割された配列にソート対象データが収容されます。 (元データが必要であればtable内に元データへのポインタを置いておきます) table内で『文字列』と『数値』が分離しているのでソート処理自体は2つのキーによるソート処理を行えばいいだけです。 aの部分の仕様が不明だったので汎用的に考えましたが、固定で'a'が入っているのなら単純に無視するtakebouさんの回答が最適でしょう。

t_u2t_u2
質問者

補足

数字文字列が複数存在して、その数も任意であるとすると、 最大の分割数のキーでソートすれば良いという考えであってます でしょうか?

  • takebou
  • ベストアンサー率43% (27/62)
回答No.2

すべてのデータのaの部分が一緒なのであれば、 aを切り離して数字部分をint型に変換すれば良いでしょう。 ちなみに文字列をint型に変える関数はatoi()です。

回答No.1

こういうときは a2 とはせずに a02 とするのが 一般的だと思いますよ。

t_u2t_u2
質問者

補足

回答ありがとうございます。 私もそう思います。でも今回求められているものは 桁合わせ的なことがされない任意の文字列なのです。

関連するQ&A