【问题标题】:c++ vector sortingC++ 向量排序
【发布时间】:2012-09-14 21:08:05
【问题描述】:

这是一个关于使用 STL std::sort 函数进行排序的机制的通用问题。我读过一些关于排序的文章,一般来说,排序向量比排序链表更快。这对于结构/对象的向量和链表是否正确?对于结构的链表,我觉得只需修改索引即可轻松实现排序。另一方面,向量的排序似乎涉及物理地切换结构/对象数据的数据位置,因为它们是连续的(这是真的吗?)。在这种情况下,似乎对链表进行排序会更快。

编辑!!!:现在有图片:

所以我想这个问题的措辞更好:排序对象、排序链表或向量哪个更快(尽管这可能取决于对象的大小)?此外,链表的排序是否如 3) 所示完成,向量的排序是否如 2) 所示完成?

【问题讨论】:

  • 您总是可以在堆上分配内存并使用指针向量。
  • 一个相关的(但我不认为重复的)问题可能会对此有所了解。 ...difference between list.sort and std::sort
  • @Mark:感谢线程,尤其是这部分答案:“此外,成员函数可以通过简单地重新链接列表节点来利用列表数据结构的特殊性质,而标准算法必须执行类似交换(或类似的操作),这需要对象构造、分配和删除。”我想我可能需要进行基准测试才能获得更直接的答案,但我认为对链表进行排序会更快。

标签: c++ sorting stdvector stdlist


【解决方案1】:

list 的排序是专门的(即list 具有排序功能,不能用std::sort 排序)。

void sort();
template <class Compare> void sort(Compare comp);

复杂性:大约 N log(N) 次比较,其中 N == size()。

std::sort 泛化。

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 的信息。它是由实现定义的。

【讨论】:

    【解决方案2】:

    你说得对,如果复制元素很慢,std::vector 会很慢。 C++11 引入了移动语义,这可能会有所帮助,元素可以移动而不是复制。

    使用归并排序很容易对链表进行排序,与任何其他好的排序算法一样,它是 O(n log n)。区别在于开销。

    如果结果对您很重要,那么始终对您的特定案例进行基准测试是个好主意。

    【讨论】:

      【解决方案3】:

      您始终可以通过对索引或指针或其他任何并行集合进行排序来进行排序。这适用于列表和向量。

      排序列表较慢的原因是最快的排序算法需要随机访问,即能够立即获取给定索引处的值的能力。你不会用列表来理解这一点。要获得链表中的第 10 个项目(例如),您必须从头开始并向前移动 10 次。

      【讨论】:

      • 归并排序是一种快速算法,不需要随机访问。
      • 是的,但归并排序需要 O(N) 辅助空间。如果您允许,那么您不妨创建一个指针向量并对其进行排序。那么你就不需要复制元素了。
      • 不,归并排序不会占用链表上的辅助空间 - 您从输入列表中删除元素并将它们放入输出列表中。
      • 嗯,我很惊讶我不知道这个。
      猜你喜欢
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2011-10-30
      • 2015-09-19
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多