目前我有一个整数列表。此列表包含指向另一个更大列表中的“活动”对象的索引值。如果较小的“活动”值列表变得太大,它会触发一个循环,该循环遍历小列表并删除已变为非活动的值。目前,它通过简单地忽略非活动值并将它们添加到第二个列表来删除它们(当第二个列表再次变满时,重复相同的过程,将它们放回第一个列表等等)。
发生此触发器后,然后使用快速排序实现对列表进行排序。这一切都很好,花花公子。
- - - -问题 - - - - -
但是,我看到了速度的潜在增益。我想象在进行排序时结合删除非活动值。不幸的是,我找不到以这种方式实现快速排序的方法。仅仅因为快速排序与枢轴一起使用,这意味着如果从列表中删除值,枢轴最终将尝试访问列表中不存在的插槽等。(除非我只是想错了) .
那么,关于如何将这两种操作结合起来的任何想法?我似乎找不到任何可以处理这个问题的快速排序算法,或者我只是没有看到如何将它实现为快速排序......任何提示都表示赞赏!
更好地了解当前情况的代码:(当前条件:值的范围可以从 0 到 200 万,没有两个值是相同的,并且通常它们大多是排序的,因为它们经常排序)
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);
}
}