创建泛型排序方法
本文关键字:方法 排序 泛型 创建 | 更新日期: 2023-09-27 18:17:05
我正在学习泛型类型,并想创建一个泛型快速排序方法,问题是类不是协变的,代码无法编译。问题是使分区方法通用,我不知道如何做到这一点,任何指导将不胜感激。
public static void Swap<T>(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 < upperBound)
{
if (array[midPoint] > array[upperBound])
{
Swap<int>(ref array[midPoint], ref array[upperBound]);
midPoint = upperBound;
break;
}
upperBound--;
}
while (midPoint > lowerBound)
{
if (array[midPoint] < array[lowerBound])
{
Swap<int>(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);
}
}
第一步是实际使用泛型:
void QuickSort<T>(T[] array, ...)
和
int Partition<T>(T[] array, ...)
在Partition
中删除Swap
的泛型参数。它将被编译器推断出来。
然而,要使其工作,您需要将T
约束为IComparable<T>
:
void QuickSort<T>(T[] array, ...) where T : IComparable<T>
和
int Partition<T>(T[] array, ...) where T : IComparable<T>
最后,您需要将"小于"answers"大于"操作符替换为对CompareTo
的调用:
if(array[midPoint].CompareTo(array[lowerBound]) < 0)
和
if(array[midPoint].CompareTo(array[lowerBound]) > 0)
您要寻找的是将T
约束为实现IComparable<T>
的任何类型
这篇MSDN文章很好地解释了c#中的泛型约束。你的方法声明看起来像这样:
public static T Partition<T>(T[] array, int mid)
where T : IComparable<T>
{
//code goes here
}
public static void QuickSort<T>(T[] array, int lower, int upper)
where T : IComparable<T>
{
//code goes here
}
将您链接到IComparable<T>
的MSDN文章也可能有所帮助。当你经常比较两个int型时,你应该调用array[midPoint].CompareTo(array[upperBound]) > 0
。如果对照0检查CompareTo的结果,所有比较操作符都是相同的。
还有一个小提示,当您调用Swap<int>(...
时,编译器可以推断类型为int
,您可以简单地将其称为Swap(...
。