C 修剪插入排序的时间

C 修剪插入排序的时间,c,performance,sorting,insertion-sort,circular-buffer,C,Performance,Sorting,Insertion Sort,Circular Buffer,我需要频繁地在大量排序列表中添加和删除元素 列表是按大小绑定的,并且相对较小,大约100个元素或更少,每个元素大约为32字节 如果插入到完整列表中,则可以丢弃最后一个元素 我做了一些简单的分析,发现将这些列表存储在数组中,并使用memmove在插入点后向后移动所有内容,效果出奇地好;甚至比使用固定大小的链接列表并将尾部链接到插入点更好。我想,永远不要低估空间局部性的力量 但我认为我可以做得更好。我怀疑我的大部分行动都会排在名单的最前面;这意味着每次插入或删除列表时,我都会移动绝大多数内容。那么,

我需要频繁地在大量排序列表中添加和删除元素

列表是按大小绑定的,并且相对较小,大约100个元素或更少,每个元素大约为32字节

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

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

但我认为我可以做得更好。我怀疑我的大部分行动都会排在名单的最前面;这意味着每次插入或删除列表时,我都会移动绝大多数内容。那么,如果我把它作为一种环形缓冲区来实现,如果一个操作更接近顶部而不是底部,我会向后移动最顶部的项目,旧的尾部会被头部覆盖,那会怎么样?理论上,这应该包括对memmove的更便宜的呼叫

但我在优雅地实现这一点上完全是在胡思乱想。列表现在可以环绕,如果列表已满,则头部位于位置k,尾部位于位置k-1%n。所以有可能做三个操作k是头,m是插入点,n是最大列表大小

memmove元素k到n-1向后移动一个 memcpy元素0到位置n-1 memmove元素1到m-1向后移动一个 我不知道这是否会比一个更大的memmove更快,但我们拭目以待

总之,我有一种直觉,通过模运算和三元运算符,有一种非常聪明和干净的方法来实现这一点。但是如果没有多个嵌套的if语句,我想不出一种方法来实现这一点

如果我们正在插入或删除。 如果我们更靠近前面或后面。 如果列表环绕数组的末尾。 如果要插入的项目与头部位于同一段,或者需要进入缠绕部分。 如果头部位于元素0处。
我确信过多的分支会毁掉我用较小的内存移动所做的任何改进。这里是否有一个我没有看到的干净的解决方案?

您是否使用二进制搜索找到插入点?@Gene:由于列表前面的偏差,目前是线性的。@user1274193我没有得到该注释。如果列表是升序的,而您是从后面插入的,那么列表的前面表示线性错误。将代码或至少算法显示为伪代码会有所帮助。此外,如果您以相反的顺序存储数组,则偏倚将适用于您。@Gene:列表从索引0开始递减。我从索引0开始搜索,然后线性进行,因为我希望大部分操作都涉及较大的项目。我的问题是,如果我在索引5处找到一个插入点,我必须向下移动接下来的94项。我不能仅仅向上移动5个项目,因为那时最大的项目将无处可去——除了环绕到索引99,现在你有了我在问题中描述的环形结构。