修剪插入排序的时间

时间:2014-01-18 21:48:08

标签: c performance sorting insertion-sort circular-buffer

我需要经常在大量排序列表中添加和删除元素。

列表的大小是绑定的,相对较小 - 大约100个元素或更少,每个元素大约为32个字节左右。

如果插入完整列表,则可以丢弃最后一个元素。

我做了一些简单的分析,发现将这些列表存储在数组中并使用memmove在插入点后向移动所有内容时效果出奇的好;甚至比使用固定大小的链表并将尾部链接到插入点更好。 (我猜,永远不要低估空间位置的力量。)

但我认为我可以做得更好。我怀疑我的大部分操作都将接近列表的顶部;这意味着每次插入或删除时我都会记住绝大多数列表。那么如果我将它作为一种环形缓冲区来实现,如果一个操作更靠近顶部而不是底部,我会将最顶层的项目向后移动,旧的尾部会被头部覆盖?理论上,这应该涉及更便宜的memmove调用。

但是我完全按照优雅的方式实现了这一点。列表现在可以环绕,头部位于位置k,尾部位于(k-1)%n(如果列表已满)。所以有可能做三个操作(k是头,m是插入点,n是最大列表大小)。

  1. 将元素k到n-1备忘录
  2. memcpy element 0到location n-1
  3. 将元素1到m-1备忘录
  4. 我不知道这是否比一个更大的memmove更快,但我们会看到。

    无论如何,我只是觉得有一种非常聪明和干净的方式通过模运算和三元运算符来实现它。但是,如果没有多个嵌套的“if”语句,我无法想到这样做的方法。

    • 如果我们要插入或删除。
    • 如果我们离前面或后面更近。
    • 如果列表“环绕”数组的末尾。
    • 如果插入的物品与头部位于同一段,或者是否需要进入缠绕的部分。
    • 如果头部位于元素0。

    我确信过多的分支会让我用更小的memmoves做出任何改进。这里有一个干净的解决方案我还没有看到吗?

0 个答案:

没有答案
相关问题