寻找最快的方法来排序2000个项目的列表,其中包含三个不同的C ++值

时间:2011-03-02 21:53:12

标签: c++ algorithm optimization sorting

基本上,程序将被给予一个项目列表,它们必须分成三个不同的“箱子”。把它想象成你正在整理三种颜色的大理石。这些项都是char类型。 谢谢你的帮助。

5 个答案:

答案 0 :(得分:11)

这实际上并不是一个经典的“排序”问题......因为只有固定数量的可能值,这被称为分区问题,并且存在一个有效的解决方案 - 分区称为Dutch flag sort,由Edsger Dijkstra首先提出。

此算法在O( n )中运行,只需要对数组进行一次传递。

通过开发循环不变量,可以非常简单地找到算法。

答案 1 :(得分:3)

我认为这对于存储桶排序是完美的:基本上创建256个int计数的列表,每次在列表中遇到值时,递增该值的计数。然后迭代计数以使它们恢复正常。这是O(n)。

答案 2 :(得分:3)

另一种选择是对partition的两次调用:

vector<char> v(2000);
...
std::partition(
    std::partition(
        v.begin(),
        v.end(),
        function_to_match_first_value()),
    v3.end(),
    function_to_match_second_value());

答案 3 :(得分:2)

答案 4 :(得分:0)

std::sort。然后O(n)搜索边界。