为什么内省型使用堆排序而不是合并排序?


9

作为涉及内省排序实现的家庭作业的一部分,我被问到为什么使用堆排序而不是合并排序(或其他算法)。 Ø(ñ日志⁡(ñ))

Introsort是一种混合排序算法,可提供快速平均性能和(渐近)最佳最坏情况性能。它从快速排序开始,并在递归深度超过基于排序元素数量(的对数)的级别时切换到堆排序。(Wikipedia,检索2014年5月6日。)

我能想到的唯一原因是,heapsort是“就位”的……但是,我并不真正理解为什么这在这里很重要。


3
如果introsort是问题的一部分,则您必须先告诉我们它是什么,然后我们才能说什么。
— 2014年

1
欢迎来到计算机科学!请注意,您可以在此处使用LaTeX以更易读的方式排版数学。请参阅此处以进行简短介绍。
— FrankW

我们只是被要求为介绍性排序编写一些伪代码,然后我们被问到为什么它使用堆排序而不是合并排序。
— user672009 2014年

@ user672009在这种情况下,请写下其中任何一个的代码,然后查看发现的内容。原因可能与性能无关。
— 拉斐尔

2
我得出的结论是,由于Quicksort是在原地进行排序的,因此我们需要使用其他原地排序算法。但是我愿意接受输入。
— user672009 2014年

Answers:


9

quicksort的2个缺点是,它需要额外的空间(以保持未排序的间隔),并且错误的数据透视选择(或旨在使您选择错误的数据透视的人为设计的序列)可能导致它成为O (n 2)时间和O (n )额外空间算法。Ø(日志⁡ñ)Ø(ñ2)Ø(ñ)

当递归深度变得太大(在附近)时切换到heapsort 意味着我们有一个保证的上限,即O (n log n )时间和O (log n )额外空间。日志⁡ñØ(ñ日志⁡ñ)Ø(日志⁡ñ)

Heapsort的额外空间要求使其成为mergsort的O (n )的更好选择,在这种情况下,对于人为设计的数组,n可能仍然很大。Ø(1个)Ø(ñ)ñ

之所以不将堆排序用于完整排序,是因为它比快速排序慢(部分原因是由于大O表达式中的隐藏常量,部分原因是缓存行为)


但是使用了heapsort ...我怀疑这是因为它像quicksort一样就位。
— user672009 2014年

我怀疑@ user672009被您的最后一句话弄糊涂了。我建议您澄清一下introsort并不是从 heapsort 开始的,因为它比较慢。
— Wandering Logic 2014年

Ø(1个)Ø(lg⁡ñ)

此外,heapsort比introsort拥有更多的缓存未命中。
— noɥʇʎԀʎzɐɹƆ

一个好的Quicksort实现在最坏的情况下不需要O(n)空间,只要它能记住堆栈中较大的子间隔并立即处理较小的子间隔即可。
— gnasher729
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.