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



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

有人可以解释一下吗?

排序的外部部分是 k-way 合并排序。外部介质(如硬盘驱动器)上的数据块或文件一次重复合并"k",直到生成单个排序文件。

最小堆是实现 k 路合并的内部部分的常用方法。

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

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

链接到源。这是一个大程序,部分原因是它有很多选择。

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

让我们从 Linux 内核代码中举一个例子:

此函数对给定数组执行堆排序。排序时间平均和最坏情况下均为 O(n log n)。虽然 qsort 平均速度快约 20%,但它受到可利用的 O(n*n) 最坏情况行为和额外的内存需求的影响,使其不太适合内核使用。

来自维基百科:

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

not

排序最适合在外部排序中创建初始运行

但是,使用堆创建初始运行会导致预期的初始运行长度是堆大小的两倍(对于键的均匀分布),因此,初始运行次数是任何对每批记录进行排序并将其写入运行的方法的一半(使用相同数量的 RAM)。
通过双向合并,一半的初始运行可以节省整个通道。使用高级合并方案、高度(将运行数合并为一个)甚至传递次数(比率数据/RAM 大小),这会失去影响。