什么排序算法适合这种“流状”条件?

时间:2012-03-09 13:36:14

标签: algorithm sorting

我有一个接收数据的缓冲区,这意味着数据就像'stream',并且在'IO'中有延迟。我现在的做法是当缓冲区已满时,使用qsort对缓冲区进行排序并将结果写入磁盘。但是在进行qsort时有明显的延迟,所以我正在寻找一些其他的排序算法,这些算法可能会在数据被添加到缓冲区时开始排序,以减少整体消耗的时间。

不知道我是否已经明确表示并在需要时留下任何评论,谢谢

3 个答案:

答案 0 :(得分:5)

堆排序使数据永久保持在部分排序状态,因此与插入排序相当。但它的速度要快得多,并且与插入排序的O(n 2 )相比,O(n log n)的情况最差。

这怎么样?大概在某些时候你必须停止从流中读取,存储你已经排序的内容,并开始阅读一组新的数据?

答案 1 :(得分:2)

我认为合并排序或树排序可以提供很大帮助。看why on wikipedia

  • 当您可以在合理的大块中切割大量输入时,合并排序更合适。
  • 当您一次插入小块时,树排序更合适。

您希望实现在线排序算法,即在以简化方式接收数据时运行的算法。通过网络搜索online algorithms,您可能会发现其他不错的算法。

在你的情况下,我会使用树排序。它没有比quicksort更好的复杂性(大部分时间都是O(nlog n)而在少数情况下都是O(n²))。但它会摊销每项投入的成本。这意味着在添加最后一个数据后您必须等待的延迟不是O(nlog n),而是O(log n)

答案 2 :(得分:0)

您可以尝试使用我的Link Array结构。在保持排序的同时顺序添加随机数据应该没问题(查看表中的数字)。这是Skip list方法的变体,但更容易实现和逻辑(尽管Skip列表的性能应该更好)