排序通用集合?

时间:2013-03-10 17:17:42

标签: c# sorting

假设我有一个通用列表。

IList<T> list;

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

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

4 个答案:

答案 0 :(得分:2)

为了能够在列表must be comparable中对某些类型的项进行排序,因此对于.NET,您必须假设T实现IComparable<T>。现在您可以比较项目,这只是实现排序算法的问题,例如:

两者都是O(n * log(n))但是对于采访我会坚持Merge排序因为我发现它更容易实现。我认为选择一个的重点是建议一些完全简单化的运行时间,例如: Bubble sort

答案 1 :(得分:1)

有关大量排序算法,请参阅Wikipedia

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

答案 2 :(得分:1)

您可以使用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()正在做的事情。

答案 3 :(得分:1)

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

要比较两个元素,您可以要求调用者传入某些内容进行比较,或使用Comparer.Default为您创建一个元素。

为了按顺序放置元素,我建议实现QuickSort。