寻找对包含 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 个项目的列表进行排序的最快方法的主要内容,如果未能解决你的问题,请参考以下文章