2017-01-31 7 views
-1

数字が文字列として入力され、普通にソートされると、正しい出力が得られることを知っています。しかし、誰かがどのように/なぜこれが起こっているのか説明することができますか?数字を数字順に並べ替え

例のテストケース:

入力:

100 1 10 2 21 20 

出力:

どれだけデフォルト lexicographical string comparison作品です
1 10 100 2 20 21 
+0

ような何かを行うことができますか*? –

+0

おそらく最初の桁と他の桁とを比較して2番目のようになります...あなたのコードなしであなたに伝えることはできません – izlin

+0

"誰かがどのように/なぜこれが起こっているのか説明できますか?" - あなたが言った理由:*まさに*文字列*です。 「値」は文字の並び順でソートされ、辞書編集では一度に1つずつ比較されます。 – WhozCraig

答えて

2

文字。 (すなわち、昇順の値に基づいた順序と同じである相対的な辞書順を持っています)

実は、整数を文字列として扱っているときには、0,1,2,3の数字を考慮する必要があります。 「b」「c」「d」「e」「f」「g」「h」「i」の4,5,6,7,8,9となるように、 'j'。したがって、入力の並べ替えは、文字列の並べ替えと考えることができます。

オリジナル入力。

100 1 10 2 21 20 

は次のように考えることができます。

baa b ba c cb ca 

この場合、適切な順序付けが行われます。

b ba baa c ca cb 

値を元に戻すと、これはあなたの質問で提供された出力であることがわかります。あなたが「秘密」を知っていれば

1 10 100 2 20 21 
+0

ありがとう@ilimしかし、私は私の担当者以来upvoteすることができません<15 hehehe – theavatar

+0

@theavatarあなたは質問の著者です。提供された回答の中で、たとえあなたがアップヴォートやダウンボートできない場合であっても、あなたの質問に対する回答としてそれらの1つを選択することができます。 – ilim

+0

@theavatar [ツアー](http://stackoverflow.com/tour)をまだお持ちでない場合は、ぜひご利用ください。 – ilim

1

自然順序が埋め込まれた数字は数字として扱われるように、文字列をソート意味:あなたはおそらくnatural sortと呼ばれて探している

。これは、ソートのための自然な順序を使用する場合はこれを取得することを意味します

代わりに、デフォルトのソート動作の
1 one 
2 two 
3 three 
10 ten 

:数字は、文字として考えたときに、アルファベットと同じように扱われ

1 one 
10 ten 
2 two 
3 three 
0

それらを並べ替え、番号のリストを読み込み、その後、それらをプリントアウトするには、C++で極めて簡単です。

「秘密」は、標準ライブラリに存在する機能を使用することです。この場合(数値の読み込み、ソート、印刷)、std::vectorstd::istream_iteratorstd::sortstd::copyおよびstd::ostream_iteratorについて知る必要があります。

次に、あなたが番号のリストを読めば、なぜあなたは数字として*それらを読んでいない

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    // Create a vector containing numbers read from std::cin 
    std::vector<int> number(std::istream_iterator<int>(std::cin), 
          std::istream_iterator<int>()); 

    // Sort the numbers 
    std::sort(begin(numbers), end(numbers)); 

    // Print all the numbers in the vector to std::cout 
    std::copy(begin(numbers), end(numbers), 
       std::ostream_iterator<int>(std::cout, " ")); 
} 
関連する問題