循环创建双精度并将它们插入到排序数组中,在C中

假设我有一组已排序的双打。

{ 0.124, 4.567, 12.3 } 

一个正的,非零的double是由代码的另一部分创建的,需要在保持排序的同时插入到该集合中。 例如,如果创建的double是7.56 ,则最终结果是,

 { 0.124, 4.567, 7.56, 12.3 } 

在我的代码中,这个“创建双重并插入有序集合”过程然后重复了很多次。 可能是500k到100万次。 我不知道总共会创造多少双打,但我知道上限。

尝试

我天真的第一种方法是创建一个长度=上限的数组,并用零填充它,然后添加初始的双精度集(“add”=用双精度替换0值的数据)。 每当创建一个double时,我将它添加到数组并执行插入排序,我读到这对排序有序数组很有用。

我有一种感觉,运行500k到100万插槽将是一个严重的性能问题。 (或者我错了?)在C中是否有更高效的数据结构和/或算法?

编辑:

我想保持集合排序的原因是因为在每次“创建双重并插入有序集合”过程之后,我需要能够查找该集合中的最小元素(并且可能通过将其替换为0来删除它) )。 我认为这样做的最好方法是保持集合排序。

但如果情况并非如此,也许还有另一种选择?

由于您要做的只是在每次迭代中拉出最小元素,所以请使用min-heap 。 您可以实现它们以进行O(1) 插入 ,O(1) find-min和O(1) 减少键操作(但请注意,删除最小元素总是需要O(log n)时间)。 对于你正在做的事情,堆将大大加快。

您可以使用二进制搜索来查找插入点,然后在那里插入值,而不是运行插入排序。 但这很慢,因为您可能需要多次移位大量数据(想想如果随机数据按您所需要的顺序排序会发生什么,时间将是O(N^2) )。

最快的方法是先插入,然后立即对所有内容进行排序。 如果无法做到这一点,请考虑使用自平衡有序树结构(例如RB-Tree)替换arrays。