在linux中进行快速,半精确的排序

时间:2016-02-16 23:42:44

标签: linux bash shell sorting

我正在浏览Linux中的大量文件列表,即“查找”(目录行走)的输出。我想按文件名对列表进行排序,但我想尽快开始处理文件。

我不需要排序100%正确。

如何进行“局部排序”,可能会在某些时候关闭但会快速输出?

1 个答案:

答案 0 :(得分:2)

这是StackOverflow,而不是SuperUser,因此算法答案对您来说应该足够了。

尝试实施HeapSort。但是,不要对完整的名称列表进行排序,而是执行以下操作。

  1. 选择常量M。它越小,越多"关闭"它会和#34;更快"算法将开始打印结果。在M等于所有名称数量的限制情况下,它将是一种精确的排序算法。

  2. 加载第一个M元素,heapify()

  3. 从堆中取出最低元素,然后打印出来。将下一个未排序的名称放入其位置,然后执行siftDown()

  4. 重复直到用完未排序的名称。对堆中剩余的元素执行标准HeapSort。

  5. 此算法的名称数量是线性的,并且一旦读取了它们的第一个M,就会开始打印名称。第2步是O(M) == O(1)。第3步为O(log M) == O(1),重复O(N)次,因此总数为O(N)

    该算法将尝试尽可能长时间地将大元素保留在堆中,同时尽可能快地从堆中推送最低元素。因此,输出看起来好像几乎已经分类了。

    IIRC,这个算法的变体实际上是GNU sort在切换到磁盘MergeSort之前所做的事情,以尽可能长时间地保持已排序的数据运行并最小化磁盘上的合并次数。