创建通用排序方法

我正在学习generics类型,并希望创建一个通用的QuickSort方法,问题是类不是共变量而代码无法编译。 问题是使分区方法通用,我不知道如何做,任何指导将不胜感激。

public static void Swap(ref T a, ref T b) { T temp = a; a = b; b = temp; } public static int Partition(int[] array, int mid) { int midPoint = mid, upperBound = array.Length - 1, lowerBound = 0; while (lowerBound != upperBound) { while (midPoint  array[upperBound]) { Swap(ref array[midPoint], ref array[upperBound]); midPoint = upperBound; break; } upperBound--; } while (midPoint > lowerBound) { if (array[midPoint] < array[lowerBound]) { Swap(ref array[midPoint], ref array[lowerBound]); midPoint = lowerBound; break; } lowerBound++; } } return midPoint; } public static void QuickSort(int[] array,int lower,int upper) { int mid = Partition(array, (lower + upper) / 2); if (upper <= lower) { } else { QuickSort(array, mid + 1, upper); QuickSort(array, lower, mid - 1); } } 

第一步是实际使用generics:

 void QuickSort(T[] array, ...) 

 int Partition(T[] array, ...) 

Partition中从Swap删除generics参数。 它将由编译器推断。

但是,要使其工作,您需要将T约束为IComparable

 void QuickSort(T[] array, ...) where T : IComparable 

 int Partition(T[] array, ...) where T : IComparable 

最后,您需要使用CompareTo调用替换“小于”和“大于”运算符:

 if(array[midPoint].CompareTo(array[lowerBound]) < 0) 

 if(array[midPoint].CompareTo(array[lowerBound]) > 0) 

您正在寻找的是将T约束到任何实现IComparable

这篇MSDN文章很好地解释了C#中的generics约束。 您的方法声明将如下所示:

 public static T Partition(T[] array, int mid) where T : IComparable { //code goes here } public static void QuickSort(T[] array, int lower, int upper) where T : IComparable { //code goes here } 

将您链接到IComparable的MSDN文章也可能会有所帮助。 无论你经常比较两个整数,你都会调用array[midPoint].CompareTo(array[upperBound]) > 0 。 如果检查CompareTo的结果为0,则所有比较运算符都相同。

还有一个小小的注意事项,当你调用Swap(... ,编译器可以将类型推断为int ,你可以简单地将其称为Swap(...