按数字顺序对数字排序

时间:2017-01-31 11:26:26

标签: c++ sorting

我知道当数字作为字符串输入并正常排序时,我会得到正确的输出。但有人可以解释这是怎么发生的?为什么会这样?

示例测试用例:

输入:

100 1 10 2 21 20

输出:

1 10 100 2 20 21

3 个答案:

答案 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 ++中 了。

&#34;秘密&#34;是使用标准库中存在的功能。在这种情况下(阅读数字,排序,打印出来),您需要了解std::vectorstd::istream_iteratorstd::sortstd::copystd::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, " "));
}