假设我有一个通用列表。
IList<T> list;
我需要对项目进行排序,但我不能使用像Sort
这样的.NET方法,因为大多数集合都没有。{由于我事先并不知道该类型是什么,我该如何对项目进行排序?
public void Sort(IList<T> list) {
}
答案 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。