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

Posted

技术标签:

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

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

【问题讨论】:

en.wikipedia.org/wiki/Counting_sort 有趣的是,我遇到了完全相同的问题。我想我认识这个人。是的,这是家庭作业,是的,我们可以使用互联网寻求帮助。感谢所有建议。 【参考方案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】:

你看过这个吗? http://www.sorting-algorithms.com/few-unique-keys

【讨论】:

以前没见过那个。很好的资源。【参考方案5】:

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

【讨论】:

以上是关于寻找对包含 C++ 中三个不同值的 2000 个项目的列表进行排序的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

在 mysqli 中插入许多值的最佳方法?

s-s-rS 三个具有相似值的不同表的组合

具有一个日期和三个不同值的数据框:我怎样才能得到中间的那个?

基于包含不同值的不同集合生成变化的算法

选择 3 行包含不同值的列 - 自联接?

获取 List 中不同值的列表