1

我正在学习泛型类型并想创建一个泛型 QuickSort 方法,问题是类不是协变的,代码无法编译。问题是使分区方法通用,我不知道该怎么做,任何指导将不胜感激。

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);
        }
    }
4

2 回答 2

4

第一步是实际使用泛型:

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>

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

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

if(array[midPoint].CompareTo(array[lowerBound]) > 0)
于 2013-06-06T07:37:13.953 回答
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
}

将您链接到MSDN 文章对于IComparable<T>. 无论您在哪里定期比较两个整数,您都会改为调用array[midPoint].CompareTo(array[upperBound]) > 0. 如果对照 0 检查 CompareTo 的结果,所有比较运算符都是相同的。

还有一点需要注意的是,当您调用 时Swap<int>(...,编译器可以推断出类型int,您可以简单地将其称为 as Swap(...

于 2013-06-06T07:38:21.523 回答