2

参照による配列の受け渡しについて混乱しています。配列はヒープに格納されるため、配列がパラメーターとして渡される場合、パラメーターの値はヒープ内の場所であると私は信じていました。これは、変数が何を表しているかについて混乱を招く可能性があります。

  1. 配列がヒープに格納されている場合、ref配列をメソッドに渡すときのキーワードの正確な意味は何ですか? 値によって渡され、値には配列への参照が含まれているため、呼び出されたメソッドの配列を変更すると呼び出し元のメソッドが変更されると私は信じていました。

  2. スキップSortして代わりにDoSort直接呼び出すと、unsortedArray正しくソートされます。以下のプログラムで、unsortedArray実行の最後にソートされないのはなぜですか? これは、これが再帰アルゴリズムであるという事実と関係がありますか?

コードは次のとおりです。

public class Program {
    static void Main(string[] args) {
        int[] unsortedArray = new[] { 9, 7, 5, 3, 1 };
        Sort(unsortedArray);
    }

    public static void Sort(int[] sortArray) {
        DoSort(ref sortArray);
    }

    public static void DoSort(ref int[] doSortArray) {
        if (doSortArray.Length == 1) {
            return;
        }
        int midpoint = doSortArray.Length / 2;

        // divide the array into the left portion
        int[] left = new int[midpoint];
        for (int i = 0; i < midpoint; i++) {
            left[i] = doSortArray[i];
        }

        // divide the array into the right portion 
        int[] right = new int[doSortArray.Length - midpoint];
        int j = 0;
        for (int i = midpoint; i < doSortArray.Length; i++) {
            right[j] = doSortArray[i];
            j++;
        }

        DoSort(ref left);
        DoSort(ref right);

        doSortArray = Merge(left, right);
    }

    /// <summary>
    /// Merges the specified unmerged array.
    /// </summary>
    /// <param name="left">The left.</param>
    /// <param name="right">The right.</param>
    private static int[] Merge(int[] left, int[] right) {
        int i = 0;
        int[] result = new int[left.Length + right.Length];

        int leftIndex = 0;
        int rightIndex = 0;
        while (leftIndex < left.Length || rightIndex < right.Length) {
            if (leftIndex < left.Length && rightIndex < right.Length) {
                if (left[leftIndex] <= right[rightIndex]) {
                    result[i] = left[leftIndex];
                    leftIndex++;
                } else {
                    result[i] = right[rightIndex];
                    rightIndex++;
                }
            }
            else if (leftIndex < left.Length) {
                result[i] = left[leftIndex];
                leftIndex++;
            }
            else if (rightIndex < right.Length) {
                result[i] = right[rightIndex];
                rightIndex++;
            }
            i++;
        }

        return result;
    }
}

配列を引数として渡す (C# プログラミング ガイド)

4

1 に答える 1

2

違いは次のとおりです。

int[] array = null;
DoSort(array)
//array is still null

DoSort(int[] array)
{
 array = new int[10];
}

...

int[] array = null;
DoSort(ref array)
//array is new int[10]

DoSort(ref int[] array)
{
 array = new int[10];
}

どちらの場合でも、配列の内容を変更できます。参照によって渡された場合にのみ、呼び出し元で参照の実際の値を変更できます。

refこの行のためにあなたの例が必要です

doSortArray = Merge(left, right);
于 2012-12-13T21:22:42.347 に答える