目前我有一个整数列表。此列表包含指向另一个更大的列表中的“活动”对象的索引值。如果较小的“活动”值列表变得太大,则会触发循环,该循环遍历小列表并删除已变为非活动的值。目前,它通过简单地忽略非活动值并将它们添加到第二个列表来删除它们(当第二个列表再次填满时,重复相同的过程,将它们放回第一个列表,依此类推)。
发生此触发后,将使用Quicksort实现对列表进行排序。这一切都很好,花花公子。
-------问题---------
但是,我看到了速度的潜在增长。我想象正在进行排序的同时删除非活动值 ,而 。不幸的是,我找不到以这种方式实现快速排序的方法。仅仅因为快速排序与枢轴一起工作,这意味着如果从列表中删除值,则数据透视表最终会尝试访问列表中不存在的插槽等等。(除非我只是考虑错误)
那么,关于如何结合这两个操作的任何想法?我似乎无法找到任何可以处理这个快速排序的排序算法,或者我可能只是没有看到如何将它实现为快速排序......任何提示都值得赞赏!
更好地了解目前正在进行的代码: (当前条件:值的范围可以是0到2百万,没有2个值是相同的,并且通常它们大多是排序的,因为它们经常被排序)
if (deactive > 50000)//if the number of inactive coordinates is greater than 50k
{
for (int i = 0; i < activeCoords1.Count; i++)
{
if (largeArray[activeCoords[i]].active == true)//if coordinate is active, readd to list
{
activeCoords2.Add(activeCoords1[i]);
}
}
//clears the old list for future use
activeCoords1.Clear();
deactive = 0;
//sorts the new list
Quicksort(activeCoords2, 0, activeCoords2.Count() - 1);
}
static void Quicksort(List<int> elements, int left, int right)
{
int i = left, j = right;
int pivot = elements[(left + right) / 2];
while (i <= j)
{
// p < pivot
while (elements[i].CompareTo(pivot) < 0)
{
i++;
}
while (elements[j].CompareTo(pivot) > 0)
{
j--;
}
if (i <= j)
{
// Swap
int tmp = elements[i];
elements[i] = elements[j];
elements[j] = tmp;
i++;
j--;
}
}
// Recursive calls
if (left < j)
{
Quicksort(elements, elements, left, j);
}
if (i < right)
{
Quicksort(elements, elements, i, right);
}
}
答案 0 :(得分:1)
听起来您可能会因使用red-black tree(或其他平衡二叉树)而受益,您的搜索,插入和删除时间将为O(log n)。树将始终排序,因此重新排序将不会有大的重击。
您在访问类型(搜索,插入,删除)方面的划分是什么?您对覆盖面的限制是什么?
答案 1 :(得分:1)
我会使用List<T>
或SortedDictionary<TKey, TValue>
作为您的数据结构。
由于您排序的原因(“基于感受的微观优化”)不是一个好的,我会避免它。一个很好的理由是“它对绩效产生了可衡量的影响”。
在那种情况下(或者你只是想这样做),我推荐一个SortedDictionary。所有的分类工作已经为你完成,没有理由重新发明轮子。
如果一个适当的数据结构足够,则无需使用两个列表。红黑树似乎是合适的,显然在SortedDictionary according to this
中使用