参照による配列の受け渡しについて混乱しています。配列はヒープに格納されるため、配列がパラメーターとして渡される場合、パラメーターの値はヒープ内の場所であると私は信じていました。これは、変数が何を表しているかについて混乱を招く可能性があります。
配列がヒープに格納されている場合、
ref
配列をメソッドに渡すときのキーワードの正確な意味は何ですか? 値によって渡され、値には配列への参照が含まれているため、呼び出されたメソッドの配列を変更すると呼び出し元のメソッドが変更されると私は信じていました。スキップ
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;
}
}