0

Mergesortで一般的なアルゴリズムを実装しようとしていますC#が、Constraints. 多くの参考文献を検索しましたが、私のようにアルゴリズムを実装しているものは見つかりません。

C# の MergeSort アルゴリズム

ソートアルゴリズムの汎用実装

とにかく、ユーザーがインターフェイスから継承するデータセットをマージソートすることのみを許可する実装を提供しようとしていIComparableます。

以下は私がこれまでに持っているものです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SortUtil
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> testList = new List<int> { 1, 5, 2, 7, 3, 9, 4, 6 };
            Mergesort.mergeSort<int>(testList); // Compiler Error at this Line.
        }
    }
    class Mergesort
    {   
        public static void mergeSort<T>(ref List<T> inputData)
            where T: IComparable<T>
        {
            mergeSort(ref inputData, 0, inputData.Count - 1);
        }

        private static void mergeSort<T>(ref List<T> inputData, int firstIndex, int lastIndex)
            where T: IComparable<T>
        {
            // If the firstIndex is greater than the lastIndex then the recursion 
            // has divided the problem into a single item. Return back up the call 
            // stack.
            if (firstIndex >= lastIndex)
                return;

            int midIndex = (firstIndex + lastIndex) / 2;

            // Recursively divide the first and second halves of the inputData into
            // its two seperate parts.
            mergeSort(ref inputData, firstIndex, midIndex);
            mergeSort(ref inputData, midIndex + 1, lastIndex);

            // Merge the two remaining halves after dividing them in half.
            merge(ref inputData, firstIndex, midIndex, lastIndex);
        }

        private static void merge<T>(ref List<T> inputData, int firstIndex, int midIndex, int lastIndex)
            where T: IComparable<T>
        {
            int currentLeft = firstIndex;
            int currentRight = midIndex + 1;

            T[] tempData = new T[(lastIndex - firstIndex) + 1];
            int tempPos = 0;

            // Check the items at the left most index of the two havles and compare
            // them. Add the items in ascending order into the tempData array.
            while (currentLeft <= midIndex && currentRight <= lastIndex)
                if (inputData.ElementAt(currentLeft).CompareTo(inputData.ElementAt(currentRight)) < 0)
                {
                    tempData[tempPos++] = inputData.ElementAt(currentLeft++);
                }
                else
                {
                    tempData[tempPos++] = inputData.ElementAt(currentRight++);
                }

            // If there are any remaining items to be added to the tempData array,
            // add them.

            while (currentLeft <= midIndex)
            {
                tempData[tempPos++] = inputData.ElementAt(currentLeft++);
            }

            while (currentRight <= lastIndex)
            {
                tempData[tempPos++] = inputData.ElementAt(currentRight++);
            }

            // Now that the items have been sorted, copy them back into the inputData
            // reference that was passed to this function.
            tempPos = 0;
            for (int i = firstIndex; i <= lastIndex; i++) {
                inputData.Insert(firstIndex, tempData.ElementAt(tempPos));
            }
        }
    }
}

My issue:Program クラスの Main メソッドでコンパイラ エラーが発生しました。ただし、静的に呼び出すときに、 mergeSort関数にパラメーター化された型を指定する必要はありませんか?

エラーが発生しています"The best overloaded method match for... has some invalid arguments."

実装に関する提案や、このエラーを修正する方法を教えていただければ幸いです。注意してください、私は Java に最も慣れています。C# はワイルドカードを直接サポートしていないため、このアプローチは私にはなじみがありません。これに関する説明もいただければ幸いです。

4

2 に答える 2

1

MergeSortパラメータrefが必要なので、refキーワードが必要です。これはうまくいくはずです:

Mergesort.mergeSort<int>(ref testList);  

ref キーワードにより、引数は値ではなく参照によって渡されます。参照渡しの効果は、メソッド内のパラメーターへの変更が、呼び出し元のメソッドの基になる引数変数に反映されることです。参照パラメーターの値は、基になる引数変数の値と常に同じです。

于 2013-08-11T00:25:30.143 に答える