我有一个关于 Linux 中排序实用程序的问题。为什么它使用合并?有像 Radix 或 Counting 这样的排序算法,其复杂度为 O(n)(在任何情况下,最坏和更好的情况下),然后是 Merge,其复杂度为 O(n*Log(n))。为什么那些更快的算法没有在排序实用程序中使用?
这让我很困惑,因为现代机器可以使用那些更快的算法可能需要的更大的 RAM。
corutils sort.c 中的示例代码用于对文本文件进行排序。基数或计数排序的一个问题是排序涉及文本字段或文本行中的整行。为了提高性能,初始阶段默认使用 16 个线程对指向文本行的指针数组进行排序。一旦转换到合并文件,它就会切换到 k 路合并,k 默认为 16,使用最小堆进行合并。对于传统硬盘驱动器,默认 k 为 16 有意义,但对于快速存储(如 NVMe SSD),较小的 k 值更有意义。