• ベストアンサー

数字文字列のソート方法

文字列に数字を含むデータのソートを行うプログラムを 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

  • バケット法による文字列ソート

    バケット法のアルゴリズムを用いて、入力した任意の文字列 (例) "tanaka" "yamashita" "suzuki" "yamamoto" を、 "suzuki" "tanaka" "yamamoto" "yamashita" といった具合にアルファベット順にソートするプログラムについて、 バケット法のアルゴリズム自体は理解しているのですが、それをいざプログラムにするというと、構造がイマイチ思いつきません。 C言語でバケット法を用いて文字列のソートを行うプログラムを、 具体的に、どなたか教えてくださらないでしょうか? 初歩的な質問ですみません。一応、C言語の基本的なことについては 大体理解しているつもりですが、まだまだC言語初心者のため、 なるべく簡単なプログラムを作成していただければ幸いです。

  • TextBoxに入力された文字列のソート

    TextBoxに入力された文字列のソート TextBoxに入力された文字列のソート 開発環境:Visual Web Developer 2008 express 言語:Visual Basic TextBoxを縦5行横3列に並べた表形式の入力フォームがあり、1列目のTextBox(番号…1,4、7、10、13)に入力された文字列(数値)を基準に、昇順にソートし、行ごと入れ替えるプログラムを作りたいのですが、TextBoxを利用したソートの参考になるものが見つからず息詰まっています。どなたかサンプルや参考になるサイトがあれば、教えてください。 ###入力フォーム### 1  あああ あああ 3  ううう ううう 2  いいい いいい 5  おおお おおお 4  えええ えええ ###実際に出したい結果### 1  あああ あああ 2  いいい いいい 3  ううう ううう 4  えええ えええ 5  おおお おおお

  • 文字列をソートする方法

    数値をソートする方法にはバブルソートやクイックソートなどがあり アルゴリズムは分かるのですが 文字列を五十音順にソートしたい場合にはどのようにしたら良いですか? 検索をかけてみたのですが、大抵プログラミング言語に備わったsortの方法が紹介されており 自分で処理を行う方法については書かれていません。 ExcelのSort機能を使わない方法で教えてください。

  • 行列データ?の文字列操作についてです。

    行列データ?の文字列操作についてです。 ----------------------------------------------- ID A B C D E 1 1.5 1.1 a 6 2 7.4 b 1 3 7.2 c 1 4 3.2 3.1 a 1 5 1.9 1.6 a 4 6 4.0 d 3 8.0 (上手く張れませんので、画像ファイルをつけました。 実際のデータはこのようにtabが入っています。) ----------------------------------------------- 上記のような文字列?をテキストボックスのようなところに入力(ペースト)し、 変換ボタンを押すことにより、 変換後文字列 1.1-1.5(6, a), 1.6-1.9(4, a), 3.1-3.2(1, a), 4.0(3, d, 8.0), 7.2(1, c), 7.40(1, b) と変換させたい。 行っていることは下記になります。 1、B列の数字が入力されていて、A>Bの時にはAとBを入れ替える。 2、A列の数字で昇順でソートする。 3、B列の数字が入力されているものは「A-B」とする。 4、それぞれの行を「A-B(D, C,E)」として「,」でつなぐ。 今回文字列の例として6行のものを示しましたが、行数は増減します。 列はE列まででこちらは増減しません。 Excel VBAを用いて行っているのですが、javascriptで組みたいと考えています。 可能なものでしょうか?

  • ソートに関する質問です

    C言語でのプログラム作成の課題が解けなくて困っています。 バブルソートを使って、1000000個の整数データを昇順に並べ替えるプログラムを作成するというものです。 自分なりに作成したプログラムは、mallocでデータを格納する動的領域を確保して、後はシンプルにバブルソートの処理を行っています。 データ数が5,6万程度なら正常な動作が確認できるのですが、それより大量のデータ数だと、処理に時間が掛かりすぎるせいか、もしくは処理しきれずに動かなくなってしまったのか分かりませんが、プログラムの処理がいつまでたっても終わりません。 おそらくバブルソートの2重ループのあたりで、膨大な処理になってしまうのだと思うのですが、この問題についての改善策をどなたかご教授いただけませんでしょうか。

  • 文字列を数字型に変換したい

    いつもお世話になっております。 eclipseというツールでC言語のプログラムを触っているのですが、 文字列の数字を数値型に変換して掛け算をしたいのですが、 型変換の関数はありますでしょうか??

  • csv元データーの数字の列が、""で囲まれているせいか、数値としてのソートできません

    次の式でソートしたいのですが、 @LINES = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @LINES; csv元データーの数字の列が、 "28000000","鈴木", のように""で囲まれているせいか、<=>で数値としてのソートできません。 cmpで文字列としてのソートは出来ます。 どうしたら良いのでしょうか?

    • ベストアンサー
    • Perl
  • 複数の文字列をソートするプログラム

    現在、Cで複数の文字列をソートするプログラムを作っているのですが、どういう流れで考えればいいのか思いつかず困っています。 どなたかご教授お願いします。

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

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

  • vba 文字列の並び替え

    こんにちは! VBAにて以下の処理をしたいのですがどうやっても上手くいかず悩んでます。 A列には文字列B列には数字が入っています。 B列を昇順で並び替えし且つA列に指定した文字列がある場合先頭にデータを昇順で持ってくる。 ※B列で並び替えたあとにif構文で切り取り→挿入を試みたのですがどうしても昇順にならず 泣 どうかご教授下さい(ToT) 宜しくお願い致します。 A B EEEE 1 EEEE 2 RRRR 3 RRRR 4 FFFF 5 DDDD 6 上記の状態からRRRRを先頭に持っていき昇順で並び替えする。

このQ&Aのポイント
  • EP-879ABを使用して印刷すると、変な文字が表示される問題が発生しています。
  • エクセルやインターネットの文字や写真を印刷しても、同じような変な文字が印刷されてしまいます。
  • また、印刷を中止しても「中止しています」という文字が表示され、状態が終わらない状況が続いています。
回答を見る

専門家に質問してみよう