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


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.