我需要一种数据结构,可以尽快地插入元素并对自身进行排序。我将插入的数量远远多于排序的数量。删除操作不是很重要,空间也不是问题。我的具体实现还将节点存储在数组中,因此查找时间为O(1),也就是说您不必担心这个问题。
如果你需要插入的数量比排序要多很多,那么最好使用未排序列表/向量,并在需要进行排序时进行快速排序。这样可以保持插入非常快速。唯一的缺点是,由于它不是在许多插入上分摊的,所以排序是一个相对较长的操作。如果你依赖相对恒定的时间,这可能会很糟糕。顺便提一下,还有第二个缺点。如果你低估了排序频率,这可能很快就会比树或排序列表慢。例如,如果你每次插入后都进行排序,那么插入+快速排序的循环就是一个坏主意。
如果您不需要随机访问数组,请使用堆。 最坏和平均时间复杂度: O(log N) 插入 O(1) 读取最大值 O(log N) 删除最大值 可以重新配置以提供最小值而不是最大值。通过反复删除最大/最小值,您可以在O(N log N)中获得排序列表。
如果您在每个排序之前可以执行大量插入,则显然应该只附加项目并在必要时尽快进行排序。我的最爱是归并排序。这是O(N * log(N)),行为良好,并且最小化了存储操作(new,malloc,tree balancing等)。但是,如果集合中的值是整数并且相对密集,则可以使用O(N)排序,在其中只使用每个值作为一个足够大的数组的索引,并在该索引处设置布尔值TRUE。然后,您只需扫描整个数组并收集TRUE的索引即可。您说您正在将项目存储在查找为O(1)的数组中。除非您使用哈希表,否则这表明您的项目可能是密集整数,因此我不确定您是否甚至拥有问题。无论如何,内存分配/删除都很昂贵,您应该通过预分配或汇集来避免它。