为什么称为堆排序最适合外部排序?

时间:2018-01-05 16:01:40

标签: sorting heapsort binary-heap external-sorting

在研究排序算法时,它被称为堆排序用于外部排序。 在处理外部存储时,我无法弄清楚它在排序技术方面有何不同?或者什么是堆排序唯一被认为对外部排序有用的东西?

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:1)

我们来自the Linux kernel code

  

此函数在给定数组上执行堆操作。排序时间是平均和最差情况下的O(n log n)。虽然qsort的平均速度提高了大约20%,但它遭受了可利用的O(n * n)最坏情况行为和额外的内存需求,这使得它不太适合内核使用。

来自Wikipedia

  

Heapsort还与合并排序竞争,合并排序具有相同的时间范围。合并排序需要Ω(n)辅助空间,但是heapsort只需要一个恒定的数量。实际上,在具有小型或慢速数据缓存的机器上,Heapsort运行速度更快,并且不需要那么多的外部存储器。

答案 1 :(得分:1)

排序的外部部分是k-way合并排序。外部媒体上的数据块或文件(例如硬盘驱动器)会一次重复合并“k”,直到生成单个已排序的文件。

min-heap是实现k-way合并的内部部分的常用方法。

创建数据块或文件的初始传递可以是任何内部排序,如果需要稳定性,则可以稳定。在排序记录的情况下,合并排序可用于对指向记录的指针数组进行排序,这减少了空间要求,因为只有指针数组需要第二个数组,而不是记录的第二个数组。应该注意的是,对指针进行排序可能比排序记录慢,因为通过指针排序最终会随机访问记录以进行比较,这对缓存不友好。

大文本文件的Gnu排序是外部排序的一个示例。它一次读取一行“块”,创建指向行的指针,并在指针上使用合并排序,然后为每个排序的块创建一个临时文件。然后它在临时文件上执行16路(默认值为16)合并,直到它到达最终合并步骤,最终合并将进入指定的输出文件。

链接到来源。这是一个很大的计划,部分原因是它有很多选择。

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/sort.c

答案 2 :(得分:0)

不是

  

堆排序最适合在外部排序

中创建初始运行

使用堆创建初始运行会导致预期初始运行 length 大小是堆大小的两倍(对于统一因此,初始分配的运行次数是排序每一批记录并将其写入运行时(使用相同数量的RAM)的任何方法的一半。
通过双向合并,一半的初始运行可节省整个过程。如果使用高级合并方案,则高度合并(运行次数合并为一个)或通过次数(比率数据/ RAM大小)甚至会丢失影响。