我知道当数字作为字符串输入并正常排序时,我会得到正确的输出。但有人可以解释这是怎么发生的?为什么会这样?
示例测试用例:
输入:
100 1 10 2 21 20
输出:
1 10 100 2 20 21
答案 0 :(得分:2)
数字(当被视为字符时)的处理方式与字母字符相同。 (即它们具有相对的词典顺序,与基于升值的顺序相同)
实际上,当您将整数作为字符串处理时,您可以将数字0,1,2,3,4,5,6,7,8,9视为字母' a&# 39;,' b'' C'' d'' E'' F'&# 39克'' H''我'' J&#39 ;.因此,对输入进行排序可以被认为是排序字符串。
您的原始输入;
100 1 10 2 21 20
可以被视为;
baa b ba c cb ca
适当的排序;
b ba baa c ca cb
如果您切换回值,您可能会看到这是您在问题中提供的输出,即;
1 10 100 2 20 21
答案 1 :(得分:1)
这就是默认lexicographical string comparison的工作方式。
您可能正在寻找的内容称为natural sort:
自然顺序意味着对字符串进行排序,以便将嵌入的数字视为数字。这意味着如果您使用自然顺序进行排序,则可以得到:
1 one 2 two 3 three 10 ten
而不是默认的排序行为:
1 one 10 ten 2 two 3 three
答案 2 :(得分:0)
一旦你知道"秘密"
,读取一个数字列表,对它们进行排序,然后将它们打印出去,就可以很容易地在C ++中 了。"秘密"是使用标准库中存在的功能。在这种情况下(阅读数字,排序,打印出来),您需要了解std::vector
,std::istream_iterator
,std::sort
,std::copy
和std::ostream_iterator
。< / p>
然后你可以做类似
的事情#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, " "));
}