Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 什么排序算法适合这个';流式';条件_Algorithm_Sorting - Fatal编程技术网

Algorithm 什么排序算法适合这个';流式';条件

Algorithm 什么排序算法适合这个';流式';条件,algorithm,sorting,Algorithm,Sorting,我有一个接收数据的缓冲区,这意味着数据像“流”,在“IO”中有延迟。我现在的做法是在缓冲区已满时,使用qsort对缓冲区进行排序并将结果写入磁盘。但是在进行qsort时会有明显的延迟,因此我正在寻找一些其他排序算法,这些算法可以在将数据添加到缓冲区时开始排序,以减少总体所消耗的时间 我不知道我是否已经说清楚了,如果需要的话,我会留下任何评论,谢谢,我认为合并排序或树排序会有很大的帮助。看 当您可以在合理的大块中剪切大量输入时,合并排序更合适 当您一次插入小块时,树状排序更合适 您希望实现一种

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


我不知道我是否已经说清楚了,如果需要的话,我会留下任何评论,谢谢,我认为合并排序或树排序会有很大的帮助。看

  • 当您可以在合理的大块中剪切大量输入时,合并排序更合适
  • 当您一次插入小块时,树状排序更合适
您希望实现一种在线排序算法,即在以流线型方式接收数据时运行的算法。在网上搜索,你可能会发现其他不错的算法


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

堆排序将数据永久保持在部分排序状态,因此与插入排序相当。但是,与插入排序的O(n2)相比,它的速度要快得多,并且具有O(n logn)的最坏情况


这将如何运作?大概在某个时候,您必须停止从流中读取数据,存储已排序的数据,然后开始读取新的数据集?

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

插入排序。真的;-)然而,
O(nlgn)
排序可以非常快速地对大量数据进行排序。。。而且,如果它是“大部分排序”的,则不一定会更快(在这种情况下,快速排序实际上可能非常退化!)。。。因此,设置一个快速性能分析可能是值得的。+1对于heapsort,您不需要对它进行完全排序以便在写入之间进行缓冲。是的,在我的情况下,我必须停止从流中读取并对缓冲区进行排序,然后将结果写入磁盘,然后再次开始读取并重复,直到流结束。堆排序是您想要的。将数据从流中读取到堆中,直到必须停止,然后从堆中读取并写入磁盘,直到磁盘为空。从堆中读取的数据是按排序的。为什么不使用二进制搜索树呢?从堆中轮询是O(logn)对吗?