1

私はジェネリック型を学習しており、ジェネリック QuickSort メソッドを作成したいと考えていました。問題は、クラスが共変ではなく、コードがコンパイルできないことです。問題は Partition メソッドをジェネリックにすることであり、その方法がわかりません。ガイダンスをいただければ幸いです。

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 に答える