【问题标题】:Looking for the fastest way to sort a list of 2000 items long consisting of three different values in C++寻找对包含 C++ 中三个不同值的 2000 个项目的列表进行排序的最快方法
【发布时间】:2011-03-02 21:53:11
【问题描述】:

基本上,程序将获得一个项目列表,并且必须将它们分类到三个不同的“箱”中。把它想象成你正在对三种颜色的弹珠进行分类。这些项目都是char类型。 感谢您的帮助。

【问题讨论】:

  • 有趣的是,我遇到了完全相同的问题。我想我认识这个人。是的,这是家庭作业,是的,我们可以使用互联网寻求帮助。感谢所有建议。

标签: c++ algorithm optimization sorting


【解决方案1】:

这并不是一个真正的经典“排序”问题……因为只有固定数量的可能值,这被称为 分区 问题,并且对于这三个问题存在一个有效的解决方案——称为Dutch flag sort 的方式分区,由 Edsger Dijkstra 首次提出。

此算法在 O(n) 中运行,并且只需要遍历数组。

通过开发循环不变量也可以相当简单地找到该算法。

【讨论】:

  • +1 对真正要求的内容做出了出色的猜测。
【解决方案2】:

我认为这非常适合桶排序:基本上创建一个包含 256 个 int 计数的列表,每次在列表中遇到一个值时,增加该值的计数。然后迭代计数以将它们按顺序放回原处。这是 O(n)。

【讨论】:

  • 这是迄今为止最简单,几乎可以肯定是最快的解决方案。 +1。
【解决方案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());

【讨论】:

    【解决方案4】:

    【讨论】:

    • 以前没见过那个。很好的资源。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多