【问题标题】:Sort generic collection?对通用集合进行排序?
【发布时间】:2013-02-25 20:02:00
【问题描述】:

假设我有一个通用列表。

IList<T> list;

我需要对项目进行适当的排序,但我不能使用像Sort 这样的.NET 方法,因为大多数集合都没有。由于我不提前知道类型是什么,我该如何对项目进行排序?

public void Sort(IList<T> list) {
}

【问题讨论】:

  • pokeBrokenGlass 的答案都是正确的。只要对象集合实现IComparable,您就可以对其进行排序。我已经制作了通用实现,它利用它来发挥自己的优势,可以在我的github repo 中找到。

标签: c# sorting


【解决方案1】:

为了能够在must be comparable 列表中对某种类型的项目进行排序,因此对于.NET,您必须假设T 实现IComparable&lt;T&gt;。现在您可以比较项目,只需实现排序算法即可,例如:

两者都是 O(n*log(n)) 但对于面试我会坚持合并排序,因为我发现它更容易实现。我认为这里选择一个的重点是建议一些完全简单化且运行时间不好的东西,例如Bubble sort.

【讨论】:

    【解决方案2】:

    查看Wikipedia了解大量排序算法。

    只要它们之间有顺序,你就不需要知道类型。您可以通过要求 T 成为 IComparable 的子类型来确保这一点。

    【讨论】:

    • 话虽如此,我怀疑你是否需要在面试中为 generic 类型这样做。通常可以假设您有一个简单的类型,比如整数。
    【解决方案3】:

    您可以使用 QuickSort 实现:

    static void QuickSort<T>(List<T> a, int left, int right) where T : IComparable<T>
    {
        int i = left, j = right;
        T pivot = a[(left + right) / 2];
        while (i <= j)
        {
            while (a[i].CompareTo(pivot) < 0)
                i++;
            while (a[j].CompareTo(pivot) > 0)
                j--;
            if (i <= j)
            {
                T temp = a[i];
                a[i++] = a[j];
                a[j--] = temp;
            }
        }
        if (left < j)
            QuickSort(a, left, j);
        if (i < right)
            QuickSort(a, i, right);
    }
    

    这就是List.Sort() 正在做的事情。

    【讨论】:

      【解决方案4】:

      好的,这实际上是两个问题:如何比较两个元素以查看它们的顺序,以及如何将它们按顺序排列。

      要比较两个元素,你可以让调用者传入一些东西来做比较,或者使用Comparer.Default为你创建一个。

      要按顺序排列元素,我建议实施快速排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-26
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多