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

时间:2012-09-26 17:07:12

标签: c sorting

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

{ 0.124, 4.567, 12.3 }

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

{ 0.124, 4.567, 7.56, 12.3 }

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

尝试

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

问题

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

修改

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

但如果情况不是这样,也许还有另一种选择?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

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