我有一个接收数据的缓冲区,这意味着数据就像'stream',并且在'IO'中有延迟。我现在的做法是当缓冲区已满时,使用qsort对缓冲区进行排序并将结果写入磁盘。但是在进行qsort时有明显的延迟,所以我正在寻找一些其他的排序算法,这些算法可能会在数据被添加到缓冲区时开始排序,以减少整体消耗的时间。
不知道我是否已经明确表示并在需要时留下任何评论,谢谢
答案 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列表的性能应该更好)