【发布时间】:2013-05-10 12:30:39
【问题描述】:
我使用固定长度数组实现了一个循环缓冲区。为了指向有效数据的开头,我使用了一个索引 (_startIndex)。同样,为了指向有效数据的末尾,我使用了另一个索引(_endIndex)。下面是一个例子。
9 8 7 6 5 4 3 2 1 0 <-- array indices
3 2 1 0 5 4 <-- buffer indices
-----------------------------------------
| | | | | | | | | | |
-----------------------------------------
^ ^
_startIndex _endIndex
现在我需要重新排列这个缓冲区的元素:最小的元素应该移动到缓冲区的位置 0,而最大的元素应该移动到缓冲区的位置 5。
我的想法是基于以下方法。
int GetArrayIndex(int bufferIndex)
{
return (_startIndex + bufferIndex) % LENGTH;
// LENGTH is the length of the array
}
通过这种方式,排序算法可以使用上述方法顺序读取缓冲区,因此不必知道缓冲区由同一数组的两个不连续部分组成。 有没有更好的方法来对循环缓冲区进行排序?
【问题讨论】:
-
就地排序有多重要?你可以根据缓冲区生成一个
IEnumerable<T>的数据,然后调用 orderby,然后根据结果生成一个新的缓冲区吗? -
这实际上是排序还是目标是旋转缓冲区以使第一个元素位于底层数组的第一个元素处?
-
@Servy:缓冲区应该包含要发送到网络中节点的消息。我如何评估是否需要进行就地排序?
-
@UlrichEckhardt:这实际上是排序。
-
@enzom83 好吧,如果你真的需要一个就地排序,你总是可以做我上面描述的,然后把所有的值复制回缓冲区,但是你确定你真的需要就地排序吗?