[英]c++ vector sorting
这是关于使用STL std :: sort函数进行排序的机制的一般性问题。 我读过一些关于排序的帖子,一般来说,排序向量比排序链表更快。 这对于矢量和结构/对象的链表是否正确? 对于结构的链接列表,我觉得只需修改索引就可以轻松实现排序。 另一方面,向量的排序似乎涉及物理地切换结构/对象的数据的数据位置,因为它们是连续的(这是真的吗?)。 在这种情况下,似乎排序链表会更快。
编辑!!!:现在有了图片:
所以我想问题是更好的措辞:哪个更快排序对象,排序链表或矢量(虽然这可能取决于对象的大小)? 此外,是否按照3)所示完成了链接列表的排序,并且对于完成如2)所示的向量进行了排序?
list
排序是专门的(即list
具有函数排序,不能使用std::sort
)。
void sort();
template <class Compare> void sort(Compare comp);
复杂性:大约N log(N)比较,其中N == size()。
std::sort
in generalized。
template<class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
复杂性:O(N log(N))(其中N == last - first)比较。
请注意, std::list::sort
的结果与std::stable_sort
相同。 请注意,标准中没有信息,应该如何实现sort
。 它是实现定义的。
您总是可以通过排序索引或指针的并行集合或其他任何方式进行排序。 这适用于列表和向量。
排序列表较慢的原因是最快的排序算法需要随机访问,即能够立即获取给定索引处的值的能力。 你没有得到列表。 要获得链接列表中的第10个项目(比如说),您必须从头开始并向前移动10次。
你是对的,如果复制一个元素很慢,一种std::vector
会很慢。 C ++ 11引入了可能有帮助的移动语义,可以移动元素而不是复制元素。
链接列表很容易使用合并排序进行排序,其中O(n log n)与任何其他良好排序算法相同。 不同之处在于开销。
如果结果对您很重要,那么始终对您的特定情况进行基准测试是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.