数字が文字列として入力され、普通にソートされると、正しい出力が得られることを知っています。しかし、誰かがどのように/なぜこれが起こっているのか説明することができますか?数字を数字順に並べ替え
例のテストケース:
入力:
100 1 10 2 21 20
出力:
どれだけデフォルト lexicographical string comparison作品です1 10 100 2 20 21
数字が文字列として入力され、普通にソートされると、正しい出力が得られることを知っています。しかし、誰かがどのように/なぜこれが起こっているのか説明することができますか?数字を数字順に並べ替え
例のテストケース:
入力:
100 1 10 2 21 20
出力:
どれだけデフォルト lexicographical string comparison作品です1 10 100 2 20 21
文字。 (すなわち、昇順の値に基づいた順序と同じである相対的な辞書順を持っています)
実は、整数を文字列として扱っているときには、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
。
自然順序が埋め込まれた数字は数字として扱われるように、文字列をソート意味:あなたはおそらくnatural sortと呼ばれて探している
。これは、ソートのための自然な順序を使用する場合はこれを取得することを意味します
代わりに、デフォルトのソート動作の1 one 2 two 3 three 10 ten
:数字は、文字として考えたときに、アルファベットと同じように扱われ
1 one 10 ten 2 two 3 three
それらを並べ替え、番号のリストを読み込み、その後、それらをプリントアウトするには、C++で極めて簡単です。
「秘密」は、標準ライブラリに存在する機能を使用することです。この場合(数値の読み込み、ソート、印刷)、std::vector
、std::istream_iterator
、std::sort
、std::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, " "));
}
ような何かを行うことができますか*? –
おそらく最初の桁と他の桁とを比較して2番目のようになります...あなたのコードなしであなたに伝えることはできません – izlin
"誰かがどのように/なぜこれが起こっているのか説明できますか?" - あなたが言った理由:*まさに*文字列*です。 「値」は文字の並び順でソートされ、辞書編集では一度に1つずつ比較されます。 – WhozCraig