-1

リストボックス内で 10 個の乱数をクイックソートしようとしています。しかし、ランダムなiarでこの方法を使用することはできません。誰かアドバイスをください。

コード ビハインド ボタン:

         private void btnSort_Click(object sender, EventArgs e)
    {
        Random r = new Random();
        int n = 10;
        int[] iar = new int[n];
        for (int i = 0; i < iar.Length; i++)
        {
            iar[i] = r.Next(0, 20);
            lb1.Items.Add(iar[i]);

        //here is the error i want to fill lb2 with the quicksorted array 
        // using the quicksort method

            Quicksort(iar, 0, iar.Length - 1);
        }
        for (int i = 0; i < iar.Length; i++)
        {
            lb2.Items.Add(iar[i]);
        }
    }

クイックソート法

 public static void Quicksort(IComparable[] elements, int left, int right)
    {
        int i = left, j = right;
        IComparable pivot = elements[(left + right) / 2];

        while (i <= j)
        {
            while (elements[i].CompareTo(pivot) < 0)
            {
                i++;
            }
            while (elements[j].CompareTo(pivot) > 0)
            {
                j--;
            } 
            if (i <= j)
            {
                // Swap
                IComparable tmp = elements[i];
                elements[i] = elements[j];
                elements[j] = tmp;

                i++;
                j--;
            }
        }
        // Recursive calls
        if (left < j)
        {
            Quicksort(elements, left, j);
        }
        if (i < right)
        {
            Quicksort(elements, i, right);
        }
    }

}

エラー:

エラー 2 引数 1: 'int[]' から 'System.IComparable[]' に変換できませ
ん引数

見てくれてありがとう:)

4

3 に答える 3

0

Quicksortオブジェクトの配列を取得するようにメソッドを宣言したので、sの配列ではなく、オブジェクトIComparableの配列を渡す必要があります。明らかな解決策の1つは、ラッパークラスを宣言することです。IComparableint

    class MyQuicksortableInt : IComparable
    {
        public int Value { get; set; }
        // Implementation of IComparable left as an exercise for the reader;
        // see http://msdn.microsoft.com/en-us/library/System.IComparable.aspx for details
    }

iarタイプに変更するMyQuicksortableInt[]と、既存のQuicksortコードで問題なく受け入れられます。

于 2013-01-31T19:51:53.590 に答える
0

与えられたコンテキストでは、整数のみを使用しているためではIComparableなく、実際に指定する必要はありません。また、すでに生成されたリストでアルゴリズムを実行した場合に最適に機能するときに各番号が生成されるため、int呼び出しているので、ステートメントをループの外に移動します。また、このような少量のデータを並べ替えるには、より優れた並べ替えアルゴリズムがあることにも注意してください。QuickSortQuickSort

[イベントハンドラー]をクリックします。

private void btnSort_Click(object sender, EventArgs e)
{
    Random r = new Random();
    int n = 10;
    int[] iar = new int[n];

    //Generate random numbers and store them in the Unsorted ListBox
    for (int i = 0; i < iar.Length; i++)
    {
        iar[i] = r.Next(0, 20);
        lb1.Items.Add(iar[i]);
    }

    //Sort the random numbers array
    Quicksort(iar, 0, iar.Length - 1);

    //Now the array is sorted put it in the Sorted Listbox
    for (int i = 0; i < iar.Length; i++)
    {
        lb2.Items.Add(iar[i]);
    }
}

クイックソート機能

//Take an array of integers not an array of IComparable
public static void Quicksort(int[] elements, int left, int right)
{
    int i = left;
    int j = right;

    int pivot = elements[(left + right) / 2];

    while (i <= j)
    {
        while (elements[i].CompareTo(pivot) < 0)
        {
            i++;
        }
        while (elements[j].CompareTo(pivot) > 0)
        {
            j--;
        }


        if (i <= j)
        {
            // Swap
            int tmp = elements[i];
            elements[i] = elements[j];
            elements[j] = tmp;

            i++;
            j--;
        }
    }
    // Recursive calls
    if (left < j)
    {
        Quicksort(elements, left, j);
    }
    if (i < right)
    {
        Quicksort(elements, i, right);
    }
}
于 2013-01-31T19:16:27.373 に答える
0

これを行う必要があります:

public static void Quicksort<T>(T[] elements, int left, int right) where T:IComparable<T>

それ以外の

public static void Quicksort(IComparable[] elements, int left, int right)

IComparable の代わりにその後どこでも T を使用します

于 2014-05-15T11:26:02.310 に答える