OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

数字文字列のソート方法

  • 困ってます
  • 質問No.231756
  • 閲覧数1172
  • ありがとう数1
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 25% (1/4)

文字列に数字を含むデータのソートを行うプログラムを
C言語で作成したいのですが、どうすれば良いでしょうか?

具体的に言うと、a12、a2、a10という順序で並んでいる
データを昇順にソートした場合にa10、a12,a2というように
ソートせず、ちゃんとa2,a10,a12とソートされるように
したいのですが、簡単にできるものでしょうか?

質問がわかりにくいかもしれないのですが、どうかご回答をお願いします。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル13

ベストアンサー率 37% (570/1525)

a1b12c6
a15b6
a1b12c3
a1b2...z26
こんな状況でしょうか。

ソートアルゴリズムを選択するときの基本は「データ数」と「キーの性質」、「未ソート状態のデータ並び」を把握することです。

場合によっては「第1キー~第nキーを使って全データを対象に一気にソートする」ことが正しい場合もあります。
ことによると「上位キーが同一値であったデータだけを対象として再帰的に部分ソートを繰り返す」ことが最良の場合があります。
お礼コメント
t_u2t_u2

お礼率 25% (1/4)

どうもありがとうございます。大変参考になりました。
これを踏まえてもう少し考えて作成してみたいと思います。
投稿日時 - 2002-03-09 14:14:02
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル9

ベストアンサー率 36% (37/102)

こういうときは a2 とはせずに a02 とするのが 一般的だと思いますよ。 ...続きを読む
こういうときは a2 とはせずに a02 とするのが
一般的だと思いますよ。
補足コメント
t_u2t_u2

お礼率 25% (1/4)

回答ありがとうございます。
私もそう思います。でも今回求められているものは
桁合わせ的なことがされない任意の文字列なのです。
投稿日時 - 2002-03-09 12:32:27
  • 回答No.2
レベル9

ベストアンサー率 43% (27/62)

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

ベストアンサー率 37% (570/1525)

こういう「ちょっとややこしいデータ構成」にぶつかった場合は「データ構造の一般化」を試みます。 この場合、『数字以外の文字列』と『数字列』が連結されており、全体が'\0'で終結している文字列です。 と、言うことは2つの部分を分割すれば話は単純になります。 1.数字以外の文字列 2.数字列を数値化したもの より簡単にするには構造体で置き換えた方が良いでしょう。 文字 ...続きを読む
こういう「ちょっとややこしいデータ構成」にぶつかった場合は「データ構造の一般化」を試みます。

この場合、『数字以外の文字列』と『数字列』が連結されており、全体が'\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

お礼率 25% (1/4)

数字文字列が複数存在して、その数も任意であるとすると、
最大の分割数のキーでソートすれば良いという考えであってます
でしょうか?
投稿日時 - 2002-03-09 12:44:56
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ