std::list<>::sort
中使用它。它也广泛用于外部排序,其中与顺序访问相比,随机访问可能非常昂贵。(在对不适合放入内存的文件进行排序时,您可以将其分成适合放入内存的块,使用快速排序对这些块进行排序,将每个块写入文件,然后 对生成的文件进行归并排序。)std::list
具有双向迭代器,因此std::sort
无法使用它。) - James Kanze归并排序在处理链表时更快。这是因为合并列表时指针可以很容易地改变。它只需要一次遍历(O(n))整个列表。
快速排序的原地算法需要移动(交换)数据。虽然这对于内存中的数据集非常高效,但如果您的数据集不适合内存,则可能会更加昂贵。结果将是大量的I/O。
这些天,有很多并行化发生。并行化Mergesort比快速排序(原地)简单。如果不使用原地算法,则quicksort的空间复杂度为O(n),与mergesort相同。
因此,总的来说,快速排序可能更适用于适合内存的数据集。对于更大的数据集,最好使用归并排序。
另一个选择归并排序而不是快速排序的时间是,如果数据非常相似(即不接近均匀)。快速排序依赖于使用枢轴。如果所有值都类似,则快速排序达到O(n ^ 2)的最坏情况。如果数据的值非常相似,则更有可能选择一个不良的枢轴,导致非常不平衡的分区,从而导致O(n ^ 2)运行时。最直观的例子是如果列表中的所有值都相同。
虽然Java 6及更早版本使用归并排序算法进行排序,但C#使用快速排序算法。
尽管它们都是O(nlogn)的时间复杂度,但快速排序比归并排序表现更好。快速排序的常数比归并排序小。
在实践中,请记住,除非您有一个非常大的数据集并且/或者执行排序很多次,否则这可能根本不重要。话虽如此,快速排序通常被认为是“最快”的n*log(n)排序器。请参阅已经提出的这个问题:快速排序与归并排序
std::sort
...始终如此 :) - avakarO(N^2)
),则会回退到归并排序。 - David Rodríguez - dribeas