同时排序/从列表中删除数据

时间:2013-05-04 06:32:48

标签: c# algorithm sorting

目前我有一个整数列表。此列表包含指向另一个更大的列表中的“活动”对象的索引值。如果较小的“活动”值列表变得太大,则会触发循环,该循环遍历小列表并删除已变为非活动的值。目前,它通过简单地忽略非活动值并将它们添加到第二个列表来删除它们(当第二个列表再次填满时,重复相同的过程,将它们放回第一个列表,依此类推)。

发生此触发后,将使用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);
        }
    }

2 个答案:

答案 0 :(得分:1)

听起来您可能会因使用red-black tree(或其他平衡二叉树)而受益,您的搜索,插入和删除时间将为O(log n)。树将始终排序,因此重新排序将不会有大的重击。

您在访问类型(搜索,插入,删除)方面的划分是什么?您对覆盖面的限制是什么?

答案 1 :(得分:1)

我会使用List<T>SortedDictionary<TKey, TValue>作为您的数据结构。

由于您排序的原因(“基于感受的微观优化”)不是一个好的,我会避免它。一个很好的理由是“它对绩效产生了可衡量的影响”。

在那种情况下(或者你只是想这样做),我推荐一个SortedDictionary。所有的分类工作已经为你完成,没有理由重新发明轮子。

如果一个适当的数据结构足够,则无需使用两个列表。红黑树似乎是合适的,显然在SortedDictionary according to this

中使用